使用.NET EF4.1+;MySQL

使用.NET EF4.1+;MySQL,mysql,entity-framework-4.1,ef-code-first,Mysql,Entity Framework 4.1,Ef Code First,我正在尝试使用EntityFramework4.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 cl

我正在尝试使用EntityFramework4.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; }
}
更新2: 我已经将此作为一个bug提交给MySQL开发团队,因为我不知道还能做什么。看起来应该行得通,但行不通。永久链接是

更新3: 为了测试这一点,我切换到NHibertnate 3.2。看起来很好用。我会更仔细地看看这个ORM,但我更愿意继续留在EF

更新4:
在官方的MySQL论坛上,我告诉大家这个bug的修复正在审查中。应该很快就能解决。

我今天也遇到了同样的问题,不同之处在于我不是首先依靠代码来为自己创建表,而是在创建时手动创建表

我按照给出的描述进行了操作,结果出现了与您相同的错误,我在表上手动创建了一个“鉴别器”字段,并将其类型更改为MEDIUMTEXT,但提供商坚持认为我以某种方式提供了MaxLength属性,尽管MEDIUMTEXT没有像VARCHAR那样的MaxLength,我想这一定是提供商的错误

为了解决这个问题,我使用fluent 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"));
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(m=>m.Requires(“鉴别器”).HasValue(“汽车”))
.Map(m=>m.Requires(“鉴别器”).HasValue(“自行车”);
}

我已经将鉴别器列的类型更改为VARCHAR(50),没有明显的问题,它现在对我来说运行良好。对我来说,另一种选择是迁移到另一个ORM,这太麻烦了,我将等待MySql提供程序的下一个版本,并测试他们是否修复了这个问题,同时我将坚持使用这个解决方案。

我没有使用继承,但得到了完全相同的错误。事实上,我甚至找不到一个设置为“mediumtext”的数据库列。所以,到目前为止,这是一个完全的谜团。我也没有一个包含mediumtext的列,也没有使用继承,并且得到了相同的错误。。。我在版本6.5.4.0中使用MySQL提供程序可能是另一个相关错误:
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"));
}