我有一个模型层次结构配置,如下所示:

[Table("A")]
abstract class A { }

class B : A { } // treated as abstract

[Table("C")]
class C : B { }

这将导致A和B的TPH以及C的TPT。到目前为止,这似乎还不错。将生成两个数据库表:“A”包含A和B模型记录,而“C”仅包含C模型记录列,这些列尚未保存在表“A”中。

对于表A上的TPH安排,有一个生成的“Discriminator”列,EF CF会自行创建该列以区分A类型和B类型。但是,我想重命名为。为了这篇文章的缘故,新名称可能是“Type”。

记录如何执行此操作的教程似乎建议这样做:
modelBuilder.Entity<A>()
   .Map<B>(m=>m.Requires("Type").HasValue(typeof(B).Name))
   .Map<C>(m=>m.Requires("Type").HasValue(typeof(C).Name));

不过,这似乎不起作用,因为在数据库生成过程中出现了运行时错误,说正在将A,B和C类型的模型添加到同一张表中,并且,“可以使用映射条件来区分行这些类型映射到的位置。” (这意味着什么。)

我也尝试过:
modelBuilder.Entity<A>()
    .Map<B>(m=>m.Requires("Type"))
    .Map<C>(m=>m.Requires("Type"));

.. 以及 ..
modelBuilder.Entity<A>().Map(m=>m.Requires("Type"));

..即使这些尝试编译并没有产生运行时错误,但似乎没有任何效果,因为Discriminator列仍为“Discriminator”。

我试图在A上创建一个新的字符串属性,称为“Discriminator”,随后将其重命名该属性的列元数据,但这给了我两个“Discriminator”列:“Discriminator”和“Discriminator1”。

有想法吗?

最佳答案

严格来说,这不是一个答案,而只是确认该方法应该有效...

我刚刚设法在我们使用的TPH结构中重命名了discriminator字段。
层次结构具有枚举值来区分类型。
A是基类,B是稍微完善的版本,C,D和E是具体类。

A级
B级:A
C级:B
D级
E级:A

modelBuilder.Entity<A>()
            .Map<B>(m => m.Requires("TypeId").HasValue((int)MyType.ClassB))
            .Map<C>(m => m.Requires("TypeId").HasValue((int)MyType.ClassC))
            .Map<D>(m => m.Requires("TypeId").HasValue((int)MyType.ClassD))
            .Map<E>(m => m.Requires("TypeId").HasValue((int)MyType.ClassE));

我必须记住要包括每个派生类类型,即使它从未被用作具体类。最初,我忘记了包含B,因为我当时认为这不是必需的,并且歧视字段将不断出现。

我可以想象,即使您尝试映射C类,即使它在不同的表中,EF也会有些混乱。

您在注释中提到的错误消息听起来像某些HasValue要求针对不同的类类型产生相同的值-也许。

编辑:
只需阅读this,它似乎可以处理相同的错误消息。

关于entity-framework - 无法在Entity Framework 4.1 Code First数据库中重命名Discriminator列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6638626/

10-13 06:28