【问题标题】:EF Core “Invalid column name 'Discriminator'” error with inheritanceEF Core“无效的列名'鉴别器'”错误与继承
【发布时间】:2017-04-26 15:46:36
【问题描述】:

我有以下实体:

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);
    }
}

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2012-12-08
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多