实体框架中的多对多关系与关系信息

时间:2012-10-24 00:08:10

标签: .net database oracle entity-framework ado.net

首先说,这是我第一次使用实体框架,所以如果这最终成为一个新手问题我会道歉。到目前为止,一切都进展顺利;但是,我遇到了一种情况,我不确定最好的方法是什么。

我需要建立多对多的关系;但是,多对多表包含的不仅仅是复合键。在这种情况下,实体框架不会将其视为多对多结构,因此我似乎无法轻松获取集合而无需使用干预表。有更好的方法吗?

简化示例:

  • 一个单位可以有很多单板,而单板可以有多个单元
  • 当它在一个单元中时,我们需要记录它所在的插槽。

表:

Unit
 UnitID(PK)
 UnitName

Board
 BoardID(PK)
 BoardName

UnitBoard
 UnitID(PK,FK1)
 BoardID(PK,FK2)
 Slot

当我使用ADO.NET实体数据模型将其提取到我的代码中时,我看不到从单元实体获取与单元关联的板的集合的简单方法,反之亦然。

有没有更好的方法来做或者我只需要使用相关的UnitBoards集合然后用它来构建单位/板的集合?

这似乎我可能不是第一个去做这样的事情的人。例如:我想书籍和所有者想要保留相关的BookOwner信息(如购买日期)。

2 个答案:

答案 0 :(得分:1)

  

有更好的方法可以做到这一点,还是只需要使用   UnitBoards的相关集合然后使用它来构建   单位/委员会的集合?

拥有自定义联结表的唯一方法是创建实体。您可以让EF为您管理多对多关系,这样您就可以拥有直接导航集合,或者您可以在关系中拥有自定义属性,但不能同时拥有两者。

如果您考虑为什么 - 如果EF确实允许您在关系中拥有自定义属性,您将如何访问它?要从Board转到Unit,您只需Unit.Boards。要从Unit转到Board,它将是Board.Units。你没有任何地方可以为任何个人关系设置一个插槽属性。

答案 1 :(得分:1)

即使在更新的实体框架5中,也没有解决此问题的好方法。如果您拥有正确的外键关系,您应该能够访问您的委员会或单位,如:

Unit.UnitBoards.Boards

Board.UnitBoards.Units

但如果多对多表在复合键之外具有自己的属性,则不会有直接导航属性(多对多导航)。

过滤时,您可以使用IncludeSelect来包含它们,以减少数据库调用。

var myBoards = From Context.Boards
  .Include(i => i.UnitBoards)
  .Include(i => i.UnitBoards.Select(is => is.Unit))
  .Where(...)