首先说,这是我第一次使用实体框架,所以如果这最终成为一个新手问题我会道歉。到目前为止,一切都进展顺利;但是,我遇到了一种情况,我不确定最好的方法是什么。
我需要建立多对多的关系;但是,多对多表包含的不仅仅是复合键。在这种情况下,实体框架不会将其视为多对多结构,因此我似乎无法轻松获取集合而无需使用干预表。有更好的方法吗?
简化示例:
表:
Unit
UnitID(PK)
UnitName
Board
BoardID(PK)
BoardName
UnitBoard
UnitID(PK,FK1)
BoardID(PK,FK2)
Slot
当我使用ADO.NET实体数据模型将其提取到我的代码中时,我看不到从单元实体获取与单元关联的板的集合的简单方法,反之亦然。
有没有更好的方法来做或者我只需要使用相关的UnitBoards集合然后用它来构建单位/板的集合?
这似乎我可能不是第一个去做这样的事情的人。例如:我想书籍和所有者想要保留相关的BookOwner信息(如购买日期)。
答案 0 :(得分:1)
有更好的方法可以做到这一点,还是只需要使用 UnitBoards的相关集合然后使用它来构建 单位/委员会的集合?
拥有自定义联结表的唯一方法是创建实体。您可以让EF为您管理多对多关系,这样您就可以拥有直接导航集合,或者您可以在关系中拥有自定义属性,但不能同时拥有两者。
如果您考虑为什么 - 如果EF确实允许您在关系中拥有自定义属性,您将如何访问它?要从Board
转到Unit
,您只需Unit.Boards
。要从Unit
转到Board
,它将是Board.Units
。你没有任何地方可以为任何个人关系设置一个插槽属性。
答案 1 :(得分:1)
即使在更新的实体框架5中,也没有解决此问题的好方法。如果您拥有正确的外键关系,您应该能够访问您的委员会或单位,如:
Unit.UnitBoards.Boards
或
Board.UnitBoards.Units
但如果多对多表在复合键之外具有自己的属性,则不会有直接导航属性(多对多导航)。
过滤时,您可以使用Include
和Select
来包含它们,以减少数据库调用。
var myBoards = From Context.Boards
.Include(i => i.UnitBoards)
.Include(i => i.UnitBoards.Select(is => is.Unit))
.Where(...)