Entity framework 实体框架-具有复合键和主键的联接表

Entity framework 实体框架-具有复合键和主键的联接表,entity-framework,join,key,entity,composite,Entity Framework,Join,Key,Entity,Composite,我正在努力研究实体框架处理联接表的方式,特别是因为实体框架要求联接表具有一个复合键,该复合键由我希望保持关系的两个相关实体上的主键组成。这里的问题是,可以说,我需要保持一种关系 这可能是我的数据库设计有问题,也可能是因为我对EF缺乏了解。最好通过示例(见下文)加以说明 我有三个表,每个表都有一个主键:- Table : DispatchChannel { *DispatchChannelID integer } Table : Format { *FormatID integer } T

我正在努力研究实体框架处理联接表的方式,特别是因为实体框架要求联接表具有一个复合键,该复合键由我希望保持关系的两个相关实体上的主键组成。这里的问题是,可以说,我需要保持一种关系

这可能是我的数据库设计有问题,也可能是因为我对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#的新手,如果我没有很好地解释这一点,我深表歉意,但如果您有任何建议,我们将不胜感激。

当您想让一个关联扮演比仅仅是两个类之间的一根绳子更重要的角色时,该协会成为您所在领域的一等公民,有理由将其作为类模型的一部分。这也是不可避免的,但这是次要的

因此,您应该将
EventTypeDispatchChannels
映射到一个类。除了两个外键外,表还可以有自己的简单主键。simle PK可能更简单,因此您的表
格式
可以通过一个简单的外键来实现一对多关联的
EventTypeDispatchChannel

只需寻址
dispatchChannel.Events
,就会失去多对多功能。而不是你必须做的事

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

另一方面,您只需创建一个
EventTypeDispatchChannel
并设置其基本外键值,就可以创建一个关联。与透明连接表的多对多关联只能通过向集合添加对象来设置(将
事件添加到
dispatchChannel.Events
)。这意味着必须加载集合,并且您需要一个
事件
对象,这在数据库往返中成本更高。

您好,非常感谢您的回复,我和我的同事已经得出了这个结论,但需要一些澄清。非常感谢