【问题标题】: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】:
在实体框架中研究树结构。您基本上想要一棵垂直树(即一个分支)。该框架不会只强制执行一个分支,但您可以在业务逻辑中管理它。