使用此模型:
public class Person
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Person> Children { get; set; } = new List<Person>();
public virtual List<Person> Parents { get; set; } = new List<Person>();
public virtual List<Person> Spouses { get; set; } = new List<Person>();
}
我已经构建了这个中间表
public class Marriage
{
public int PersonId { get; set; }
public int SpouseId { get; set; }
public virtual Person Person { get; set; }
public virtual Person Spouse { get; set; }
[DataType(DataType.Date)]
public DateTime MarriageDate { get; set; }
[DataType(DataType.Date)]
public DateTime DivorceDate { get; set; }
}
我对父母和孩子之间的关系定义如下:
modelBuilder.Entity<Person>()
.HasMany(p => p.Children)
.WithMany(p => p.Parents)
.UsingEntity<PersonPerson>(
s => s.HasOne(prop => prop.Parent).WithMany().HasForeignKey(prop => prop.ChildrenId),
s => s.HasOne(prop => prop.Child).WithMany().HasForeignKey(prop => prop.ParentId),
pp =>
{
pp.HasKey(prop => new { prop.ParentId, prop.ChildrenId });
}
);
我不知道如何使用中间表建立 Person 和 Spouses 之间的关系。
这是我尝试过的:
modelBuilder.Entity<Person>()
.HasOne(p => p)
.WithMany(p => p.Spouses)
.UsingEntity<Marriage>(
m => m.HasOne(prop => prop.Person)
.WithMany(Prop.Spouse)
.HasForeignKey(prop => prop.SpouseId),
m =>
{
m.HasKey(prop => new { prop.PersonId, prop.SpouseId });
}
);
我收到错误“ReferenceCollectionBuilder
事实证明这确实是多对多关系,而不是一对多。此修复是向 Person 模型添加第二个 Spouses 列表。 Person 模型现在看起来像这样:
public class Person
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Person> Children { get; set; } = new List<Person>();
public virtual List<Person> Parents { get; set; } = new List<Person>();
public virtual List<Person> Spouses { get; set; } = new List<Person>();
}
Fluent API 看起来像这样:
modelBuilder.Entity<Person>()
.HasMany(p => p.Spouses)
.WithMany(p => p.SpousesFrom)
.UsingEntity<Marriage>(
s => s.HasOne(prop => prop.Person).WithMany().HasForeignKey(prop => prop.SpouseId),
s => s.HasOne(prop => prop.Spouse).WithMany().HasForeignKey(prop => prop.PersonId),
pp =>
{
pp.HasKey(prop => new { prop.PersonId, prop.SpouseId });
}
);
然后在控制器中像这样保存它们:
if (!Person.Spouses.Contains(spouse))
{
Person.Spouses.Add(spouse);
spouse.IsSelected = false;
spouseAdded = true;
}
if (!spouse.Spouses.Contains(Person))
{
spouse.Spouses.Add(Person);
}