2013-04-02 99 views
0

我很困惑实体框架处理联接表的方式,特别是因为实体框架要求联接表具有由两个相关实体上的主键组成的组合键我想要保持关系。这里的问题是我需要与这种关系保持一种关系。实体框架 - 使用组合键和主键联接表

这可能是我的数据库设计的问题,或者是因为我对EF的理解不够。这可能是最好的例子说明(见下文);

我各有三个表具有主键: -

Table : DispatchChannel 
{ *DispatchChannelID integer } 


Table : Format 
{ *FormatID integer } 


Table : EventType 
{ *EventTypeID integer } 

事件类型和DispatchChannels之间的关系在EventTypeDispatchChannels(见下文)举行,因为这不仅包含它不是通过拉成复合键我们模型和实体框架负责维护关系。

Table : EventTypeDispatchChannels 
{ EventTypeID integer, DispatchChannelID integer 
} 

我现在的问题出现,因为EventTypeID和DispatchChannelID的每一个组合我想拥有可用格式的列表,这将是容易的,如果我EventTypeDispatchChannels表有一个主键,因此我的其他的连接表是这样的;

Table : EventTypeDispatchChannelFormats 
{ EventTypeDispatchChannelID integer, FormatID integer 
} 

缺乏对EventTypeDispatchChannels主键的是我很努力,使这项工作,但是如果我有钥匙,然后实体框架不再认为这是一个链接的实体。

我对C#相对来说比较陌生,所以如果我没有很好地解释这一点,我会很感激。

回答

0

当你想给一个关联一个更重要的角色而不仅仅是作为两个类之间的一段字符串时,这个关联就成为你的域的一级公民,并且把它作为类模型的一部分是合理的。这也是不可避免的,但这是次要的。

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

您将失去多对多功能,只需输入dispatchChannel.Events即可。在代替你所要做的

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

在另一方面,你已经获得了创建由刚刚创建EventTypeDispatchChannel并设置其原始外键值关联的可能性。只能通过向集合中添加对象来设置具有透明连接表的多对多关联(将Event添加到dispatchChannel.Events)。这意味着该集合必须加载,并且您需要一个对象,这在数据库往返中更加昂贵。

+1

非常感谢您的回复,我和我的同事几乎已经得出了这个结论,但想要澄清一下。非常感激 –