【问题标题】:Many-to-Many relationship in Entity Framework with relationship informantion实体框架中的多对多关系与关系信息
【发布时间】:2012-10-24 00:08:10
【问题描述】:

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

我需要创建一个多对多的关系;但是,多对多表不仅仅包含复合键。在这种情况下,实体框架不会将其识别为多对多结构,因此我似乎无法在不使用中间表的情况下轻松获取集合。有没有更好的方法来做到这一点?

简化示例:

  • 一个单元可以有多个板,一个板可以包含在多个单元中
  • 当它在一个单元中时,我们需要记录它在哪个插槽中。

表格:

Unit
 UnitID(PK)
 UnitName

Board
 BoardID(PK)
 BoardName

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

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

有没有更好的方法来做到这一点,还是我只需要使用相关的 UnitBoards 集合然后使用它来构建 Units/Boards 的集合?

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

【问题讨论】:

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


    【解决方案1】:

    即使在更新的 Entity Framework 5 中,也没有很好的解决这个问题的方法。如果您有正确的外键关系,您应该能够访问您的 Boards 或 Units,例如:

    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(...)
    

    【讨论】:

      【解决方案2】:

      有没有更好的方法来做到这一点,还是我只需要使用 UnitBoards 的相关集合然后使用它来构建 单元/板的集合?

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-28
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多