2016-10-26 13 views
2

Я пытаюсь использовать EF6 с существующей базой данных, с которой я должен быть совместим. База данных была сгенерирована nHibernate, а в некоторых таблицах используется модель наследования по иерархии (TPH).Как настроить имя, длину и значение столбца дискриминатора с помощью Entity Framework 6

Столбцы дискриминатора называются 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.

+0

Что такое максимальная длина здесь. Это свойство Name с общей длиной 255 для столбца (Name) или что-то еще? @daltonwide – Rajput

+0

Я использую MaxLength для сопоставления столбца SQL как nvarchar (255) – daltonwide

+0

, поэтому я предоставляю в ответ, может быть, это может исправить это, потому что код не может быть записан в комментарии. @ daltonwide – Rajput

ответ

0

Здесь

modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA")); 

вы указываете имя дискриминатора быть "Категория", так что это

if (property.Name == "Discriminator") 

будет вычисляться false, следовательно MaxLength будет EF по умолчанию.

Чтобы получить желаемое поведение, используйте Requires("Discriminator") и дайте согласие сделать все остальное.

+0

Нет, «DiscriminatorRenamingConvention» отлично работает само по себе. Столбец дискриминатора правильно переименован в «Категория». Только когда я указываю значения категорий, пользовательская длина возвращается к 128. – daltonwide

+0

Ну, зачем спрашивать, не попробовали ли вы ответы. Я всегда проверяю перед публикацией. Делайте то, что я сказал и вижу. –

+0

Мои извинения, это звучало нелогично для меня, но вы правы. Благодаря! – daltonwide