0

我正在为实体框架处理连接表的方式而苦苦挣扎,特别是因为实体框架要求连接表具有一个复合键,该组合键由我想要保持关系的两个相关实体上的主键组成。这里的问题是,可以这么说,我需要保持与关系的关系。

这可能是我的数据库设计的问题,或者同样是由于我对 EF 缺乏了解。最好通过示例来说明(见下文);

我有三个表,每个表都有一个主键:-

Table : DispatchChannel
{ *DispatchChannelID integer }


Table : Format
{ *FormatID integer }


Table : EventType
{ *EventTypeID integer }

EventTypes 和 DispatchChannels 之间的关系保存在 EventTypeDispatchChannels 中(见下文),因为它只包含一个复合键,它不会被拉入我们的模型,而实体框架负责维护这种关系。

Table : EventTypeDispatchChannels
{ EventTypeID integer, DispatchChannelID integer
}

我的问题现在出现了,因为对于 EventTypeID 和 DispatchChannelID 的每个组合,我想保存一个可用格式的列表,如果我的 EventTypeDispatchChannels 表有一个主键,这将很容易,因此我的另一个连接表看起来像这样;

Table : EventTypeDispatchChannelFormats
{ EventTypeDispatchChannelID integer, FormatID integer
}

EventTypeDispatchChannels 上缺少主键是我努力完成这项工作的地方,但是如果我有键,那么实体框架不再将其视为链接实体。

我对 C# 比较陌生,所以如果我没有很好地解释这一点,我深表歉意,但任何建议都将不胜感激。

4

1 回答 1

1

当您想赋予关联一个比两个类之间的字符串更重要的角色时,该关联就成为您领域的一等公民,并且有理由使其成为类模型的一部分。这也是不可避免的,但这是次要的。

所以你应该映射EventTypeDispatchChannels到一个类。除了两个外键之外,该表还可以有自己的简单主键。简单的 PK 可能更容易,因此您的表Format可以使用简单的外键来EventTypeDispatchChannels进行一对多关联。

您将失去多对多功能来简单地解决dispatchChannel.Events。相反,你必须做

db.DispatchChannels.Where(d => d.DispatchChannelID == 1)
                   .SelectMany(d => d.EventTypeDispatchChannels)
                   .Select(ed => ed.Event)

另一方面,您可以通过创建一个EventTypeDispatchChannel并设置其原始外键值来创建关联。与透明联结表的多对多关联只能通过将对象添加到集合来设置(添加Eventto dispatchChannel.Events)。这意味着必须加载集合并且您需要一个Event对象,这在数据库往返中更昂贵。

于 2013-04-02T20:54:36.610 回答