2012-01-02 5 views
3

私は、Entity Framework 4.1とMySQLをデータベースとして、コードファーストアプローチで.NETでクラス継承を実装しようとしています。以下のモデルは、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'. 

モデルは、古典的なシンプルな例です:SQL Serverでは

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; } 
} 

、それはVehiclesという名前だけのテーブルを作成し、カラム:Id,Year,ModelおよびDiscriminator;車や自転車のテーブルはありません。 MySQLでは、データベースは作成されていません( "Car"クラスを削除した場合、作成されるため、許可の問題などはありません)。

助けていただければ幸いです!ありがとうございました。

UPDATE 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")); 
    } 
} 

UPDATE 2: 私はより多くの何ができるかわからないので、私は、MySQLの開発チームにバグとしてこれを提出しました。それはうまくいくはずですが、そうではありません。常設リンクはhttp://bugs.mysql.com/63920です。

UPDATE 3: これをテストするために、NHibertnate 3.2に切り替えました。ちょうどうまく動作するようです。私はこのORMをよく見ていきますが、私はまだEFにとどまっています。

UPDATE 4:公式のMySQLフォーラムで 、私はreceived a responseこのバグの修正がレビューであることを伝えます。すぐに修正する必要があります。

+1

私は継承を使用していませんが、まったく同じエラーが発生しています。実際、私は 'mediumtext'に設定された単一のデータベース列を見つけることさえできません。だから、これはこれまでの完全な謎です。 – adimauro

+0

私もmediumtextの列を持っていないし、継承を使用しないで、同じエラーを取得...私はバージョン6.5.4.0でMySQLのプロバイダを使用 – X181

+0

多分別の関連するバグ:http://bugs.mysql.com/ bug.php?id = 64288 – X181

答えて

1

私は今日同じ問題に直面していましたが、違いは私のためにテーブルを作成するコード・ファーストに頼っていないということです。

hereの説明に従っていますが、同じエラーが発生しました。私は手動でテーブルの "Discriminator"フィールドを作成し、そのタイプをMEDIUMTEXTに変更しましたが、プロバイダーは何とかMaxLengthプロパティは、MEDIUMTEXTにVARCHARのようなMaxLengthがない場合でも、プロバイダのバグである必要があります。

これを回避するには、流暢なAPIを使用して、ディスクリミネータの列名(私は「Discriminator」として保存しました)と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プロバイダを待って、これを修正したかどうかをテストします。