使用.NET EF4.1 + MySQL进行类继承

时间:2012-01-02 11:54:45

标签: mysql entity-framework-4.1 ef-code-first

我正在尝试使用Entity Framework 4.1和MySQL作为数据库在.NET中实现类继承,采用代码优先的方法。下面的模型适用于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的表,其中包含以下列:IdYearModelDiscriminator;没有汽车或自行车的桌子。在MySQL中,甚至没有创建数据库(如果我删除了“Car”类,它会创建 - 所以这不是许可问题或类似的问题。)

任何帮助都会很感激!谢谢。

更新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官方论坛中,我received a response告诉我这个bug的修复程序正在审核中。应尽快解决。

1 个答案:

答案 0 :(得分:1)

今天我遇到了同样的问题,区别在于我不依赖Code First为我创建表格,我正在手动创建它们。

我已按照here给出的描述,我最终得到了与您相同的错误,我在我的桌子上手动创建了一个“Discriminator”字段,并将其类型更改为MEDIUMTEXT,但提供商坚持认为我是以某种方式提供MaxLength属性,即使MEDIUMTEXT没有像VARCHAR这样的MaxLength,我认为这必须是提供者的错误。

好吧,为了解决这个问题,我使用了流畅的API手动告诉鉴别器列名称(我只是保留为“判别器”)和EF应该从鉴别器列中得到的值,在这种情况下,这将是:< / p>

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提供程序的下一个版本并测试他们是否已修复此问题,同时我将坚持这个解决方案。