【问题标题】:One-to-one self-relationship and Entity Framework一对一的自我关系和实体框架
【发布时间】:2011-05-01 12:52:33
【问题描述】:

我想要一个可以有一个孩子(一个或零个)的实体。这个孩子和父母是同一类型。我不确定如何设置实体框架,因为我希望每个实体都有两个导航属性。一个用于导航到子级,一个用于导航到父级。基本上和双向链表是一模一样的结构。

我觉得这个表结构应该够用了:

 int | id       | PK
 int | id_next  | FK
text | data

但是如何为下一个/上一个项目创建导航属性?我只能为下一项创建导航属性。

感谢您的帮助。

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    你不能。这里的问题是一对一关系有一个非常具体的要求——FK 值在整个表中必须是唯一的。一旦不强制唯一性,您可以添加第二个指向同一个父级的实体,并且您具有一对多的关系。

    要像您在示例中描述的那样在自引用关系中强制执行此操作,您将在 id_next 上放置一个唯一索引,它将在 SQL Server 中工作。问题是实体框架不支持唯一键。由于该实体框架只能在两种不同的实体类型之间建立一对一的关系,其中依赖项中的 FK 实体类型也是它的 PK(如何强制 FK 唯一的唯一方法)= 两个实体具有相同的PK值。这不适用于自引用关系,因为一个表中不能有两个相同的 PK 值。

    【讨论】:

      【解决方案2】:

      您可以在 EF4 中通过在实体上指定 0..1 -> 0..1 关系来执行此操作。将导航属性之一命名为“上一个”,另一个命名为“下一个”。这将在基础数据库上创建一个隐藏字段。

      我还没有彻底测试过这种方法,但是当我创建数据库脚本时它似乎可以工作。

      【讨论】:

        【解决方案3】:

        在实体框架中研究树结构。您基本上想要一棵垂直树(即一个分支)。该框架不会只强制执行一个分支,但您可以在业务逻辑中管理它。

        【讨论】:

          猜你喜欢
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-24
          • 2015-05-04
          • 2016-01-27
          • 2020-09-26
          相关资源
          最近更新 更多