我有以下实体:
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
的列表时,我收到“无效的列名'判别器'”错误。在做了一些研究之后,它似乎不喜欢FoodFreezer
和ChemicalFreezer
指向单个表的事实。我需要改变什么?我是否需要一个只有FreezerId
列的FoodFreezers和ChemicalFreezers数据库表,这些列是冰箱表的FK?
答案 0 :(得分:4)
@ haim770让我走上了正确的道路。我必须将以下内容添加到FreezerConfiguration
:
builder.HasDiscriminator(x => x.FreezerTypeId)
.HasValue<FoodFreezer>(FreezerTypeEnum.Food)
.HasValue<ChemicalFreezer>(FreezerTypeEnum.Chemical);
不需要额外的表格或代码。如果我尝试使用FoodFreezer
的ID获取ChemicalFreezer
,则会返回null
。真的很酷。