C# 每个层次结构的表-基和派生的外键

C# 每个层次结构的表-基和派生的外键,c#,.net-core,entity-framework-core,ef-code-first,table-per-hierarchy,C#,.net Core,Entity Framework Core,Ef Code First,Table Per Hierarchy,我不确定这在EF 6或更早版本中是否可行。(我使用的当前版本是EF Core 3.1.4)我试图实现的是拥有一个具有某些属性的基本实体,并与另一个实体建立连接。从基本实体到具有与其他实体具有不同连接(外键或导航属性)的其他两个实体。这是可能的,还是我应该放弃这个想法 我得到的错误是: 无法在“DerivedResource1”上配置密钥,因为它是派生类型。必须在根类型“资源”上配置密钥。如果您不希望“资源”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder

我不确定这在EF 6或更早版本中是否可行。(我使用的当前版本是EF Core 3.1.4)我试图实现的是拥有一个具有某些属性的基本实体,并与另一个实体建立连接。从基本实体到具有与其他实体具有不同连接(外键或导航属性)的其他两个实体。这是可能的,还是我应该放弃这个想法

我得到的错误是:

无法在“DerivedResource1”上配置密钥,因为它是派生类型。必须在根类型“资源”上配置密钥。如果您不希望“资源”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder的配置调用中引用,也未从模型中包含的类型的导航属性中引用

以及守则:

public class Resource : BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<Connection1> Connection1 { get; set; }
}

   public class DerivedResource1 : Resource
{
    public int NrOfSeats { get; set; }
    public int Capacity { get; set; }
    public Guid Connection2Id { get; set; }
    public Connection2 Connection2 { get; set; }
}

    public class DerivedResource2 : Resource
{
    public string Title { get; set; }
    public string Text { get; set; }
    public ICollection<ManyToManyResource> ManyToManyResources { get; set; }
}
公共类资源:BaseEntity
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共ICollection连接1{get;set;}
}
公共类DerivedResource1:资源
{
公共int nrofstates{get;set;}
公共整数容量{get;set;}
公共Guid连接2ID{get;set;}
公共连接2连接2{get;set;}
}
公共类DerivedResource2:资源
{
公共字符串标题{get;set;}
公共字符串文本{get;set;}
公共ICollection ManyToManyResources{get;set;}
}
配置如下所示:

 private void ConfigureResource(EntityTypeBuilder<Resource> config)
    {
        config.ToTable("Resources")
            .HasDiscriminator<int>("ResourceType")
            .HasValue<DerivedResource1>(1)
            .HasValue<DerivedResource2>(2);
    }

    private void ConfigureDerivedResource1(EntityTypeBuilder<DerivedResource1> config)
    {
        config.HasOne(x => x.Connection2)
            .WithMany(x => x.DerivedResource1)
            .HasForeignKey(x => x.Connection2Id);
    }

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<Connection1>(config => ConfigureEntity(config, ConfigureConnection1));
        builder.Entity<DerivedResource1>(config => ConfigureEntity(config, ConfigureDerivedResource1));
        builder.Entity<Connection2>();
        builder.Entity<DerivedResource2>();
        builder.Entity<Resource>(config => ConfigureEntity(config, ConfigureResource));
        builder.Entity<ManyToMany>();
        builder.Entity<ManyToManyResource>(config => ConfigureEntity(config, ConfigureManyToManyResource));
    }
private void配置资源(EntityTypeBuilder配置)
{
config.ToTable(“资源”)
.HasDiscriminator(“资源类型”)
.HasValue(1)
.HasValue(2);
}
私有void配置DerivedResource1(EntityTypeBuilder配置)
{
config.HasOne(x=>x.Connection2)
.WithMany(x=>x.DerivedResource1)
.HasForeignKey(x=>x.Connection2Id);
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
实体(config=>ConfigureEntity(config,ConfigureConnection1));
实体(config=>ConfigureEntity(config,ConfigureDerivedResource1));
builder.Entity();
builder.Entity();
实体(config=>ConfigureEntity(config,ConfigureResource));
builder.Entity();
实体(config=>ConfigureEntity(config,ConfigureManyToManyResource));
}

3.1.4-我也会更新这个问题。