我有一个名为 Person 的类,它有一个名为 friends 的属性,其中有一个 Person 类型的列表。实际上,我将在 Person 类与其自身之间创建多对多关系。
如何使用EntityFramework和Codefirst在SQL Server中为这种关系创建一个特殊的表(最好不要使用Fluent API)?
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public List<Person> Friends { get; set; }
}
我尝试了Codefirst,但是未创建SQL Server数据库中的多对多关系表。唯一发生的事情是在 SQL Server 中创建一个名为 Person_ID 的列。它似乎只创建了一对一的关系。
SQL Server 人员数据表:
身份证 | 姓名 | 人员_ID |
---|---|---|
空 | 空 | 空 |
请记住,在关系数据库中没有一流的方法来建模对称关系。因此,如果 Alice 和 Bob 是朋友,则需要将 (Alice,Bob) 和 (Bob,Alice) 都存储在 Friendship 表中。否则你会在Alice的朋友下找到Bob,但在Bob的朋友下找不到Alice。
但对于最初的问题,默认情况下,集合导航属性将创建一对多关系。如果您想要多对多,则必须配置实体。不强制要求具有两个方向的集合导航属性。
所以类似:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Person> Friends { get; } = new List<Person>();
}
配置如下
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasMany(p => p.Friends)
.WithMany()
.UsingEntity(t => t.ToTable("Friendship"));
}