Как настроить имя, длину и значение столбца дискриминатора с помощью Entity Framework 6
Я пытаюсь использовать EF6 с существующей базой данных, с которой я должен быть совместим. База данных была сгенерирована nHibernate, и в некоторых таблицах используется модель наследования таблиц на иерархию (TPH).
Дискриминатор столбцы названы Category
(вместо Discriminator
) и имеют длину SQL 255 (вместо 128). Значения также отличаются от того, что генерирует EF.
Как настроить EF для использования существующих столбцов (имя, размер и значения)?
Я попытался определить пользовательское соглашение:
protected class DiscriminatorRenamingConvention : IStoreModelConvention<EdmProperty>
{
public void Apply(EdmProperty property, DbModel model)
{
if (property.Name == "Discriminator")
{
property.Name = "Category";
property.MaxLength = 255;
}
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));
modelBuilder.Entity<MyEntityB>().Map(x => x.Requires("Category").HasValue("CatB"));
modelBuilder.Conventions.Add<DiscriminatorRenamingConvention>();
base.OnModelCreating(modelBuilder);
}
Это создает столбец с именем Category
но с длиной 128, независимо от порядка инструкций в OnModelCreating
метод. Указание значений категории кажется перезаписанным MaxLength
,
1 ответ
Вот
modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));
Вы указываете имя дискриминатора, чтобы быть "Категория", так что это
if (property.Name == "Discriminator")
будет оценивать false
, следовательно MaxLength
будет EF по умолчанию.
Чтобы получить желаемое поведение, используйте Requires("Discriminator")
и пусть конвенция сделает все остальное.