繁体   English   中英

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

[英]Many-to-Many relationship in Entity Framework with relationship informantion

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

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

简化示例:

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

表:

Unit
 UnitID(PK)
 UnitName

Board
 BoardID(PK)
 BoardName

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

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

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

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

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

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

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

即使在更新的实体框架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(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM