Ef Core 一对多连接表

时间:2021-03-05 16:05:54

标签: c# entity-framework-core ef-core-5.0

我有两个模型,它们都有相同的第三个模型的集合。 Ef Core 5 现在为集合模型上的两个模型都创建了一个外键,但是有没有办法让它为每个关系生成一个连接表,而无需为连接表显式创建一个模型?

我的模型:

public class Model1 {
    // ...
    public List<Model3> collection;
}

public class Model2 {
    // ...
    public List<Model3> collection;
}

public class Model3 {
    // ...
}

我希望数据库看起来像这样:

表:模型 1

表:模型 2

表:Model3

表:Model3Model1(JoinTable)

  • Model3Id
  • Model1Id

表:Model3Model2(JoinTable)

  • Model3Id
  • Model2Id

但我不想要那些连接表的显式类型。 我知道 EFCore 能够为多对多关系推断这些连接表,所以我想知道是否有办法为一对多关系做到这一点。

1 个答案:

答案 0 :(得分:0)

我认为这不可能。最好的折衷方案是 Model3 中的私有属性,例如:

public class MyContext : DbContext
{
    public DbSet<Model1> Model1 { get; set; }
    public DbSet<Model2> Model2 { get; set; }
    public DbSet<Model3> Model3 { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Model3>()
            .HasMany<Model1>("Collection1")
            .WithMany(m1 => m1.Collection)
            .UsingEntity(j => {
                j.ToTable("Model3Model1");
                j.Property("Collection1Id").HasColumnName("Model3Id");
                j.Property("CollectionId").HasColumnName("Model1Id");
            });
        modelBuilder.Entity<Model3>()
            .HasMany<Model2>("Collection2")
            .WithMany(m2 => m2.Collection)
            .UsingEntity(j => {
                j.ToTable("Model3Model2");
                j.Property("Collection2Id").HasColumnName("Model3Id");
                j.Property("CollectionId").HasColumnName("Model2Id");
            });
    }
}

public class Model1
{
    public int Id { get; set; }
    public List<Model3> Collection { get; set; }
}

public class Model2
{
    public int Id { get; set; }
    public List<Model3> Collection { get; set; }
}

public class Model3
{
    public int Id { get; set; }
    private List<Model1> Collection1 { get; set; }
    private List<Model2> Collection2 { get; set; }
}

生成的连接实体有一个导航属性,其中名称为+“Id”。棘手的部分是设置所需的列名。