EF Core“无效列名称'Discriminator'”继承错误

时间:2017-04-26 15:46:36

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

我有以下实体:

public abstract class Freezer
{
    public int FreezerId { get; set; }
    public string Name { get; set; }
    public int FreezerTypeId { get; set; }
    public int Capacity { get; set; }
}

public class FoodFreezer : Freezer
{
    public List<FoodItem> Foods { get; set; }
}

public class ChemicalFreezer : Freezer
{
    public List<ChemicalItem> Chemicals { get; set; }
}

正如您所看到的,派生的Freezer类不包含任何将存储在数据库中的数据;它们只包含特定类型内容的导航属性。

我有以下配置:

internal class FreezerConfiguration<T> : DbEntityConfiguration<T> where T : Freezer
{
    public override void Configure(EntityTypeBuilder<T> builder)
    {
        builder.ToTable("Freezers");
        builder.HasKey(x => x.FreezerId);

        builder.Property(x => x.FreezerId).IsRequired();
        builder.Property(x => x.Name).IsRequired();
        builder.Property(x => x.FreezerTypeId).IsRequired();
        builder.Property(x => x.Capacity).IsRequired();
    }
}

internal class FoodFreezerConfiguration : FreezerConfiguration<FoodFreezer>
{
    public override void Configure(EntityTypeBuilder<FoodFreezer> builder)
    {
        builder.HasMany(x => x.FoodItems).WithOne(x => x.Freezer);
    }
}

当我打电话从我的上下文中获取FoodFreezer的列表时,我收到“无效的列名'判别器'”错误。在做了一些研究之后,它似乎不喜欢FoodFreezerChemicalFreezer指向单个表的事实。我需要改变什么?我是否需要一个只有FreezerId列的FoodFreezers和ChemicalFreezers数据库表,这些列是冰箱表的FK?

1 个答案:

答案 0 :(得分:4)

@ haim770让我走上了正确的道路。我必须将以下内容添加到FreezerConfiguration

builder.HasDiscriminator(x => x.FreezerTypeId)
    .HasValue<FoodFreezer>(FreezerTypeEnum.Food)
    .HasValue<ChemicalFreezer>(FreezerTypeEnum.Chemical);

不需要额外的表格或代码。如果我尝试使用FoodFreezer的ID获取ChemicalFreezer,则会返回null。真的很酷。