У меня есть конфигурация иерархии моделей, например:
[Table("A")]
abstract class A { }
class B : A { } // treated as abstract
[Table("C")]
class C : B { }
Это приводит к TPH для A и B и TPT для C. До сих пор это, кажется, работает нормально. Генерируются две таблицы базы данных: «A», которая содержит записи модели A и B, и «C», которая содержит только столбцы записей модели C, еще не сохраненные в таблице «A».
Для схемы TPH в таблице A существует сгенерированный столбец «Дискриминатор», который 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 под названием «Дискриминатор», к которому я собирался впоследствии переименовать метаданные столбца свойства, но в результате я получил два столбца «Дискриминатор»: «Дискриминатор» и «Дискриминатор1».
Идеи