我有一个模型层次结构配置,如下所示:
[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/