EF Core 7 一对多关系返回到带有中间表的同一个表

问题描述 投票:0回答:1

使用此模型:

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”不包含“UsingEntity”的定义

c# asp.net-core-mvc one-to-many ef-core-7.0
1个回答
0
投票

事实证明这确实是多对多关系,而不是一对多。此修复是向 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);
   }
© www.soinside.com 2019 - 2024. All rights reserved.