Наследование классов с .NET EF4.1 + MySQL - PullRequest
3 голосов
/ 02 января 2012

Я пытаюсь реализовать наследование классов в .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 база данных даже не создается (если я удаляю класс "Car", он создает - так что это не проблема разрешения или чего-то в этом роде).

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

ОБНОВЛЕНИЕ 1: Я пытался использовать подход таблиц к иерархии к отношениям, переключаясь на контекст ниже, но он дал мне еще одну ошибку: 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 я получил ответ сообщаем, что исправление для этой ошибки находится в обзоре.Должно быть исправлено в ближайшее время.

1 Ответ

1 голос
/ 07 февраля 2012

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

Я следовал описанию, данному здесь , и в результате у меня возникла та же ошибка, что и у вас, я вручную создал поле «Дискриминатор» в своей таблице и изменил его тип на MEDIUMTEXT, но поставщик настоял, чтобы Я как-то предоставлял свойство 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 и проверим, исправили ли они это, а пока я буду придерживаться этого решения.

...