首页 > 解决方案 > 如何将子实体映射到 EF Core 中的同一个表

问题描述

我正在使用 EF Core,我需要将子实体映射到同一个表,因为它们属于同一类型。

想象一下类层次结构的以下场景:

public class Grandpa
{
    public Guid Id { get; set; }
    public Father Robert { get; set; }
    public Father Jack { get; set; }
}

public class Father
{
    public Guid Id { get; set; }
    // I use this to reference Grandpa
    public Guid GrandpaId { get; set; }
    public List<Son> MySons { get; set; }
}

public class Son
{
    public Guid Id { get; set; }
    // I use this to reference Father
    public Guid FatherId { get; set; }
    public string Name { get; set; }
}

现在问题如下:在我的场景中(上面是复制我的真实场景的抽象),我无法制作Robert数组Jack- 它们需要单独存在。另一件事是,Grandpa实体拥有 2 个Father实体,每个Father实体拥有一个实体列表Son

我想告诉模型构建器以这样一种方式生成我的表,即所有实体都有一个表,所有Father实体都有一个表Son- 因为它们都是相同的实体,它们永远不应该作为它们的主键放在不同的表中和外键 (ID) 清楚地表明它们属于谁。

现在,你知道,在普通的 SQL 中,很容易实现这样的结构,为此编写 SQL 代码非常简单。但是,如何使用 EF Core 做到这一点?

我试过了:

1)在模型构建器中指定所有主键和外键,每个实体 2)在模型构建器中设置拥有的属性层次结构使用

modelBuilder.Entity<Father>()
  .ToTable("Fathers");
modelBuilder.Entity<Son>()
  .ToTable("Sons");
modelBuilder.Entity<Grandpa>(g => 
{
  x.OwnsOne(y => y.Robert, z => 
  { 
    z.OwnsMany(a => a.MySons, b => 
    {
      b.HasKey(k=>k.Id); 
      b.ToTable("Sons"); 
    }); 
    z.ToTable("Fathers"); 
  });
  x.OwnsOne(y => y.Jack, z => 
  { 
    z.OwnsMany(a => a.MySons, b => 
    {
      b.HasKey(k=>k.Id); 
      b.ToTable("Sons"); 
    }); 
    z.ToTable("Fathers"); 
  });
});

但是,有错误说:

Cannot use table 'Fathers' for entity type 'Grandpa.Father#Robert' since it is being used for entity type 'Grandpa.Father#Jack' and there is no relationship between their primary keys.

我必须提到,这些实体是同一实体的一部分DbContext——它们最好保持不变。

EF Core 映射或未能映射实体的方式是错误的 - 如果我删除表名规范,它只会为我的相同类型的实体创建单独的表,这是错误的。我什至没有在不同的命名空间中声明相同的实体/重复,但它实际上是相同的命名空间,相同的实体,Grandpa实体有两个Father实体,每个Father实体都有一个List<Son>.

标签: c#entity-framework-core

解决方案


推荐阅读