EF6 Fluent Api - 我需要在FluentApi中设置默认值,以便使用Map Child代替Parent

时间:2015-06-05 16:49:19

标签: c# sql entity-framework default-value ef-fluent-api

这是设置的一部分。名称简化: 我有以下课程:

  • MyClass
  • MySubclass1:MyClass
  • MySubClass2:MyClass

MyClass是另一个类(和表)的一部分,我将遗漏。

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

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

EF-part正在自动生成如下:

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行开始映射片段时出现问题:列   MyClass.KindId没有默认值,也不可为空。列值   需要存储实体数据。

我尝试在数据库上设置默认值,但我认为它需要在EF中设置默认值。 问题是:我如何使用FluentApi执行此操作?

1 个答案:

答案 0 :(得分:0)

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

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