C# 每个层次结构的表-基和派生的外键
我不确定这在EF 6或更早版本中是否可行。(我使用的当前版本是EF Core 3.1.4)我试图实现的是拥有一个具有某些属性的基本实体,并与另一个实体建立连接。从基本实体到具有与其他实体具有不同连接(外键或导航属性)的其他两个实体。这是可能的,还是我应该放弃这个想法 我得到的错误是: 无法在“DerivedResource1”上配置密钥,因为它是派生类型。必须在根类型“资源”上配置密钥。如果您不希望“资源”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder的配置调用中引用,也未从模型中包含的类型的导航属性中引用 以及守则: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
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-我也会更新这个问题。