如何用EntityFramework CodeFirst在SQL Server创建Person自关联多对多关系表
解决EntityFramework CodeFirst自引用多对多关系(无需Fluent API)
要让EF自动生成自引用多对多的中间表,核心是给Person类添加双向的集合导航属性——只定义单向的Friends集合会被EF误判为一对多关系,从而生成外键列而非独立中间表。
正确的Person类定义
public class Person { public int PersonId { get; set; } public string Name { get; set; } // 当前用户的朋友列表 public ICollection<Person> Friends { get; set; } // 把当前用户列为朋友的人列表(反向导航属性) public ICollection<Person> FriendOf { get; set; } // 建议在构造函数初始化集合,避免后续操作出现空引用异常 public Person() { Friends = new HashSet<Person>(); FriendOf = new HashSet<Person>(); } }
原理说明
EF CodeFirst的约定规则中,只有当存在双向的集合类型导航属性时,才会识别这是多对多关系,自动创建独立的中间关联表(默认表名一般为PersonPerson,包含两个外键列PersonId和PersonId1,分别对应关系的两端)。
你之前只定义了单向的Friends集合,EF会将其解析为"一个Person对应多个Person(作为朋友)"的一对多关系,因此只会在Person表中生成外键列Person_ID,而非中间表。
内容的提问来源于stack exchange,提问作者Saber Safdari
相关产品推荐
相关产品推荐

