【问题标题】:Modeling related entities with SQL Server and entity framework使用 SQL Server 和实体框架对相关实体进行建模
【发布时间】:2010-12-15 00:14:10
【问题描述】:

我的数据库中有一个存储项目的表:

Items
-------
ItemID
Name
...
Etc

还有一个单独的表,用于存储第一个表中两个不同项目的 PK。我希望能够列出一个项目,然后列出任意数量的相关项目。我已经尝试搜索示例,但没有发现太多令人惊讶的...

RelatedItems
------------
ItemID
RelatedItemID

如果我有四个产品,它们的 ID 分别是 1、2、3 和 4...,并且 1 与 2 和 3 相关,我可能会有如下所示的数据:

ItemID   RelatedItemID
1        2  
1        3  
4        1  

然后我在 Entity Framework Designer 中对它们进行建模,并且设计器会自动将 Items 表中的关联添加到自身(多对多)。设计器还添加了两个导航属性,如果我在 Item #1 上使用第一个属性,我会得到 Item #1 在第一列中的所有项目,如果我使用第二个属性,我会得到 Item #1 所在的所有项目第二列。

然而,我只想拥有一个导航属性,我可以在其中说 Items.RelatedItems,它会返回上述两个属性组合时的所有项目。我知道我可以在事后加入这两个结果,但我不禁认为我做错了什么并且有更好的方法。

希望这一切都足够清楚。

【问题讨论】:

    标签: sql sql-server entity-framework database-design


    【解决方案1】:

    听起来 SQL 模式不太擅长对您正在寻找的概念进行建模。如果您想建立方向关系(项目 A 与项目 B 相关,但项目 B 可能与项目 A 相关,也可能不相关),那么您选择的模式会很好地工作。如果您正在寻找一种分组风格的关系(项目 A 和 B 在同一个组中),我可以考虑使用不同的方法。但是我想不出一种使用传统关系数据库对固有的双向关系进行建模的好方法。

    一些解决方法可能是使用连接两个结果的视图,或者使用触发器确保从 A 到 B 的每个映射都有从 B 到 A 的对应映射,这样两个属性总是返回相同的对象。

    【讨论】:

      【解决方案2】:

      如果你有一个Item的实例,就叫它item,那么下面会给你相关的item...

      item.RelatedItems.Select(ri => ri.Item);
      

      您在 item 上的 RelatedItems 属性(即您提到的第一个导航属性)将是 RelatedItem 对象的集合,每个对象都有自己的两个导航属性,其中一个将被命名为 Item 并且将是指向相关项目。

      请注意,这是空气代码,因为我现在没有任何可以测试的东西,但我认为这会满足您的需求。

      如果你想让它更简单,你可以写一个扩展方法来包装 Select(),像这样......

      public static IEnumerable<Item> RelItems(this Item item) {
        return item.RelatedItems.Select(ri => ri.Item);
      }
      

      那么你可以这样做......

      item.RelItems();
      

      请注意,我无法命名扩展方法 RelatedItems,因为这会与 EF 为第二个表创建的导航属性发生冲突。这可能不是该表的好名称,因为它不是实际的项目,而是项目的 ID。无论哪种方式,上面的代码都应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 2019-04-14
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        相关资源
        最近更新 更多