2

EF 5 Beta 2 Code-First を使用しています。BrandVehicleという名前の 2 つのエンティティを持つ edmx ファイルを作成しました。

1 つのブランドは 0 個以上 (多数) のビークルを持つことができ、すべてのビークルにはブランド(必須) が必要です。 Vehicleには、 null 不可のBrandIDという名前の外部キーがあります。

(relationship)   
    Brand  +------------------->  Vehicle
          (1)                  (*)

また、EF 5 DbContext Generatorを使用して POCO クラスを作成しました。

問題

レコードの読み取りまたは書き込みを試みると、次のエラーが発生します。

エラー 3023: 行 155:Column Vehicle.BrandID から始まるフラグメントのマッピングで問題が発生しました テーブル Vehicle 内にマッピングする必要があります: デフォルト値がなく、null 可能ではありません。

注意: Vehicle が2 つのクラス ( Car & Motorbike ) の派生元である抽象基本クラスであるTPC継承マッピングを使用しています。

クラス定義と関連する流暢な API コードを次に示します。

//------------ Class definiions ---------------

public abstract partial class Vehicle
{
    public int VehicleID { get; set; }
    public short BrandID { get; set; }

    public virtual Brand Brand { get; set;
}

public partial class Car : Vehicle
{
    public string BodyType { get; set; }
}

public partial class Motorbike : Vehicle
{
}

public partial class Brand
{
    public Brand()
    {
        this.Vehicles = new HashSet<Vehicle>();
    }        

    public short BrandID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}


//--------------- Fluent API code ---------------

modelBuilder.Entity<Vehicle>()
    .Property(p => p.VehicleID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);    

modelBuilder.Entity<Car>()
    .Map(m =>
    {
        m.ToTable("Car");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Motorbike>()
    .Map(m =>
    {
        m.ToTable("Motorbike");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Brand>()
    .HasMany(b=>b.Vehicles)
    .WithRequired(v=>v.Brand)
    .HasForeignKey(p => p.BrandID);


modelBuilder.Entity<Brand>()
    .Property(p => p.BrandID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

すべてが問題ないように見え、何度もチェックされているため、これは非常に奇妙です。

どんな考えでも大歓迎です。

4

1 に答える 1

1

TPC 継承は、基本型にナビゲーション プロパティがあるこの種のモデルでは機能しません。

...EFでTPCを使用すると、基本型での関連付けを避ける必要があります...

(ここからの引用: http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx )

モデルには TPT または TPH 継承を使用する必要があります。

于 2012-04-01T19:02:23.560 に答える