Наследование классов с .NET EF4.1 + MySQL

Я пытаюсь реализовать наследование классов в .NET, используя Entity Framework 4.1 и MySQL в качестве базы данных, с подходом, основанным на коде. Приведенная ниже модель работает с SQL Server, но в MySQL происходит сбой со следующей ошибкой:

Schema specified is not valid. Errors: 
(11,6) : error 0064: Facet 'MaxLength' must not be specified for type 'mediumtext'.

Модель представляет собой классический простой пример:

public abstract class Vehicle
{
    public int Id { get; set; }
    public int Year { get; set; }
}

public class Car : Vehicle
{
    public string CarProperty { get; set; }
}

public class Bike : Vehicle
{
    public string BikeProperty { get; set; }
}

public class Db : DbContext
{
    public DbSet<Vehicle> Vehicles { get; set; }
    public DbSet<Car> Cars { get; set; }
    public DbSet<Bike> Bikes { get; set; }
}

С SQL Server создается только таблица с именем Vehicles со столбцами: Id, Year, Model и Discriminator; нет столов для автомобилей или велосипедов. В MySQL база данных даже не создается (если я удалю класс "Автомобиль", она создается - так что это не проблема разрешения или что-то в этом роде).

Любая помощь будет оценена! Спасибо.

ОБНОВЛЕНИЕ 1: я попытался использовать подход Table-Per-Hierarchy к отношениям, переключившись на контекст ниже, но это дало мне другую ошибку: Can't create table 'aimpa.#sql-da8_2c' (errno: 150).

public class Db : DbContext
{
    public DbSet<Vehicle> Vehicles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Vehicle>()
            .Map<Car>(o => o.ToTable("Cars"))
            .Map<Bike>(o=>o.ToTable("Bikes"));
    }
}

ОБНОВЛЕНИЕ 2: я отправил это как ошибку команде разработчиков MySQL, потому что я не знаю, что еще я могу сделать. Вроде должно работать, но не работает. Постоянная ссылка: http://bugs.mysql.com/63920.

ОБНОВЛЕНИЕ 3: я переключился на NHibertnate 3.2, чтобы проверить это. Кажется, работает просто отлично. Я получше рассмотрю этот ORM, но я бы предпочел остаться с EF.

ОБНОВЛЕНИЕ 4: на официальном форуме MySQL я получил ответ о том, что исправление этой ошибки находится на рассмотрении. Должно быть исправлено в ближайшее время.


person tyron    schedule 02.01.2012    source источник
comment
Я не использую наследование, но получаю точно такую ​​же ошибку. На самом деле, я даже не могу найти ни одного столбца базы данных, для которого установлено значение «mediumtext». Так что пока это полная загадка.   -  person adimauro    schedule 06.01.2012
comment
У меня также нет столбца со средним текстом, я не использую наследование и получаю ту же ошибку... Я использую MySQL-Provider в версии 6.5.4.0.   -  person X181    schedule 30.03.2012
comment
Возможно, другая связанная ошибка: bugs.mysql.com/bug.php?id=64288   -  person X181    schedule 31.03.2012


Ответы (1)


Сегодня я столкнулся с той же проблемой, разница в том, что я не полагаюсь на Code First для создания таблиц для меня, я создаю их вручную по ходу работы.

Я следовал описанию, данному здесь, и я столкнулся с той же ошибкой, что и вы, я вручную создал поле «Дискриминатор» в своей таблице и изменил его type в MEDUMTEXT, но провайдер настаивал на том, что я каким-то образом предоставляю свойство MaxLength, хотя MEDIUMTEXT не имеет MaxLength, как VARCHAR, я предполагаю, что это ошибка провайдера.

Что ж, чтобы обойти это, я использовал свободный API, чтобы вручную указать имя столбца дискриминатора (которое я просто сохранил как «Дискриминатор») и значения, которые EF должен ожидать от столбца дискриминатора, в вашем случае это будет:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Vehicle>()
            .Map<Car>(m => m.Requires("Discriminator").HasValue("Car"))
            .Map<Bike>(m => m.Requires("Discriminator").HasValue("Bike"));
}

Я изменил тип столбца дискриминатора на VARCHAR(50) без видимых проблем, теперь он работает хорошо. Альтернативой для меня был бы переход на другую ORM, что слишком много работы, я подожду следующих версий провайдера MySql и проверю, исправили ли они это, пока я буду придерживаться этого решения.

person Anderson Fortaleza    schedule 07.02.2012