EF6 FluentApi -我需要在FluentApi中设置默认值,以便映射使用子而不是父

本文关键字:FluentApi 映射 默认值 设置 EF6 | 更新日期: 2023-09-27 17:54:02

下面是部分设置。姓名简化:我有以下类:

  • MyClass
  • MySubclass1: MyClass
  • MySubClass2: MyClass

MyClass是另一个类(和表)的一部分,我将省略它。

我正在尝试做一个EF6查询(使用context.Set<MyClass>.Where(...))

我想返回子类而不是父类,我想避免使用Discriminator。原因是:MyClass上有一个属性已经定义了它是MySubclass1还是MySubclass2。该属性称为KindId,是查找表(Kinds)的FK

ef部分按照如下方式自动生成:

public partial class MyClassMap : EntityTypeConfiguration<MyClass>
{
    public MyClassMap ()
    {
        ToTable("MyClasses", "MySchema");
        //...etc (other implementations)
        HasRequired(c=> c.Kind)
            .WithMany(kind => kind.MyClasses)
            .HasForeignKey(c => new { c.KindId });
        Initialize();
    }
    partial void Initialize();
}

这意味着我只能更新Initialize()。我已经这样做了:

public partial class MyClassMap 
{
    partial void Initialize()
    {
        Map<MySubclass1>(c => c.Requires("KindId").HasValue(1));
        Map<MySubclass2>(c => c.Requires("KindId").HasValue(2));
    }
}

当我运行EF查询时,我得到以下异常:

错误3023:从x行开始的映射片段的问题:ColumnMyClass。KindId没有默认值,也不可为空。列值用于存储实体数据。

我尝试在DB上设置默认值,但我认为它需要在EF中设置默认值。问题是:我如何使用FluentApi做到这一点?

EF6 FluentApi -我需要在FluentApi中设置默认值,以便映射使用子而不是父

您可能会得到一个错误,因为它不知道为基类使用什么鉴别符值。所以,我认为你还需要一个基类的映射——例如:

Map<MyClass>(c => c.Requires("KindId").HasValue(0));