我有这样的模型层次结构配置:
[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”仅包含尚未保存在表“A”中的 C 模型记录列。
对于表 A 上的 TPH 排列,有一个生成的“Discriminator”列,EF CF 自己创建该列来区分 A 型和 B 型。该列很好且符合预期;但是,我想重命名它。为了这篇文章,新名称可能是“类型”。
记录如何执行此操作的教程似乎暗示了这一点:
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"));
..即使这些尝试编译并没有产生运行时错误,似乎也没有任何效果,因为鉴别器列仍然是“鉴别器”。
我尝试在 A 上创建一个名为“Discriminator”的新字符串属性,随后我将重命名该属性的列元数据,但这只是给了我两个“Discriminator”列:“Discriminator”和“Discriminator1”。
想法?