【问题标题】:EF6 Fluent Api - I need to set Default value in FluentApi in order to Map Child to be used instead of ParentEF6 Fluent Api - 我需要在 FluentApi 中设置默认值,以便映射要使用的子级而不是父级
【发布时间】:2015-08-20 17:09:12
【问题描述】:

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

  • 我的班级
  • 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:Column 开始映射片段时出现问题 MyClass.KindId 没有默认值并且不能为空。列值 需要存储实体数据。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。这是一个很好的建议。不幸的是,它将异常更改为以下内容:'MyClass 类型已映射到表'MySchema.MyClasses'。在单个 Map 调用中指定表的所有映射方面。我确实知道它已被映射,只是不在当前地图中。有什么建议吗?
    • 啊,是的,Map&lt;MyClass&gt; 也需要包含c.ToTable("MyClasses", "MySchema")...但是如果不能修改生成的配置....
    • 你是对的,不幸的是 .ToTable 生成了:(
    • @Recipe:你用什么来生成代码?
    • 它是一个领域建模工具(由框架人员自定义编写),可以(与 T4 模板一起)翻译成 c#
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2015-08-14
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多