Как настроить имя, длину и значение столбца дискриминатора с помощью 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") и пусть конвенция сделает все остальное.

Другие вопросы по тегам