我正在努力实现实体框架处理连接表的方式,特别是因为实体框架要求连接表具有由我希望保持关系的两个相关实体上的主键组成的复合键。这里的问题是,我需要与这种关系建立关系。
这可能是我的数据库设计的问题,或者同样是由于我对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#比较新,所以如果我没有这么好解释,请道歉,但任何建议都会受到赞赏。
答案 0 :(得分:0)
当您希望为关联提供一个更重要的角色而不仅仅是在两个类之间成为一个字符串时,该关联就会成为您域中的一等公民,并且将其作为类模型的一部分是合理的。这也是不可避免的,但这是次要的。
所以你应该将EventTypeDispatchChannels
映射到一个类。除了两个外键之外,表可以有自己的简单主键。 simle PK可能更容易,因此您的表Format
可以使用EventTypeDispatchChannels
的简单外键进行一对多关联。
您将失去许多功能,只需简单地解决dispatchChannel.Events
。相反,你必须做
db.DispatchChannels.Where(d => d.DispatchChannelID == 1)
.SelectMany(d => d.EventTypeDispatchChannels)
.Select(ed => ed.Event)
另一方面,您可以通过创建EventTypeDispatchChannel
并设置其原始外键值来创建关联。只能通过向集合添加对象来设置与透明联结表的多对多关联(将Event
添加到dispatchChannel.Events
)。这意味着必须加载集合,并且您需要一个Event
对象,这在数据库往返中更昂贵。