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