2012-01-02 63 views
3

我试图在.NET中使用实体框架4.1和MySQL作为数据库,使用代码优先的方法实现类继承。下面的模型与SQL Server的工作,但未能在MySQL中,出现以下错误:使用.NET EF4.1 + 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,ModelDiscriminator;没有汽车或自行车表。在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

UPDATE 3: 我转换到NHibertnate 3.2,为了测试这个。似乎工作得很好。我会更好地研究这个ORM,但我更愿意留在EF中。

UPDATE 4: 在MySQL官方论坛,我received a response讲,对于这个bug修复正在审查中。应该尽快解决。

+1

我没有使用继承,但得到完全相同的错误。实际上,我甚至找不到一个设置为'mediumtext'的单个数据库列。所以,到目前为止,这是一个完整的谜题。 – adimauro 2012-01-06 16:07:24

+0

我也没有与中文的专栏,不使用继承,并得到相同的错误...我使用版本6.5.4.0的MySQL提供商 – X181 2012-03-30 15:49:28

+0

也许另一个相关的错误:http://bugs.mysql.com/ bug.php?ID = 64288 – X181 2012-03-31 10:14:03

回答

1

我今天面临同样的问题,不同之处在于我不是依靠Code First为我创建表格,而是在我手动创建表格时创建它们。

我跟着给出的描述here,我最终发现了和你一样的错误,我在我的表上手动创建了一个“Discriminator”字段,并将其类型更改为MEDIUMTEXT,但提供者坚持认为我以某种方式提供了MaxLength属性,尽管MEDIUMTEXT没有像VARCHAR这样的MaxLength,但我认为这必须是提供程序上的一个错误。

嗯,为了解决这个问题,我使用了流畅的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提供程序的下一个版本,并测试它们是否解决了这个问题,同时我会坚持使用此解决方案。