2012-01-02 66 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提供程序的下一個版本,並測試它們是否解決了這個問題,同時我會堅持使用此解決方案。