2016-09-13 10 views
2

私のモデルクラスは、そのようになります。EFが重複をテーブルに挿入したのはなぜですか?

public class Car { 
     public int Id { get; set; } 
     public string Make { get; set; } 
     public string Model { get; set; } 
    } 

ApplicationDbContextクラス:

public class ApplicationDbContext : DbContext { 
    public DbSet<Car> Cars { get; set; } 

    public ApplicationDbContext() 
     : base("Rental") { 
     Configuration.LazyLoadingEnabled = true; 
    } 
} 

とシード方法:(私は何度でもを)私が実行した後

protected override void Seed(ApplicationDbContext context) { 

     context.Cars.AddOrUpdate(c => c.Id, 
      new Car { Id = 1, Make = "BMW", Model = "750i" }, 
      new Car { Id = 2, Make = "Audi", Model = "A6" }, 
      new Car { Id = 3, Make = "Honda", Model = "Civic" } 
      ); 
} 

update-databaseこれらのオブジェクトは、パッケージマネージャコンソールでデータベースに一旦追加されます。私は終わったupdate-databaseを実行した後、次に

public class ApplicationDbContext : DbContext { 
     public DbSet<Car> Cars { get; set; } 
     public DbSet<JetCar> JetCars { get; set; } 
     public DbSet<Dragster> Dragsters { get; set; } 
     public ApplicationDbContext() 
      : base("Rental") { 
      Configuration.LazyLoadingEnabled = true; 
     } 
    } 

、その後、種子法

protected override void Seed(ApplicationDbContext context) { 

     context.Cars.AddOrUpdate(c => c.Id, 
      new Car { Id = 1, Make = "BMW", Model = "750i" }, 
      new Car { Id = 2, Make = "Audi", Model = "A6" }, 
      new Car { Id = 3, Make = "Honda", Model = "Civic" } 
      ); 

     context.Dragsters.AddOrUpdate(d => d.Id, 
      new Dragster { Id = 4, Make = "Chevy", Acceleration = 3.23, } 
      ); 

     context.JetCars.AddOrUpdate(d => d.Id, 
      new JetCar { Id = 4, Make = "Jetty", Thrust = 89 } 
      ); 

     } 

しかし、私は車のクラスのサブクラスを追加した後:その後、

public class Car { 
    public int Id { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public virtual ICollection<Rental> Rentals { get; set; } 
} 

public class JetCar : Car { 
    public int Thrust { get; set; }//kN 
} 

public class Dragster : Car { 
    public double Acceleration { get; set; } 
} 

はApplicationDbContextを修正しましたホンダ、BMW、アウディの2台のオーディオーイミネーターをCarに設定します。それはなぜそうですか?これを防ぐ方法は?

答えて

0

すべてのシードオブジェクトについて、以下のようにテストする必要があります。

var car1 = context.Cars.FirstOrDefault(c => c.Make == " BMW "); 

if(car1 == null) 
{ 
    context.Cars.Add(new Car { Id = 1, Make = "BMW", Model = "750i" }); 
} 
1

エンティティのフレームワークでは重複があるため、重複があります。 継承を使用すると、EFは同じ表を保持しますが、Discriminatorを使用します。継承がない場合、識別子はありません(それを必要としないことに注意してください)。

最初に追加した車は実際のCarタイプですが、継承が存在しないため(まだ)、EFは識別器を追加しません。 DragsterJetCarを追加すると、EFにDiscriminatorが必要になります。

最初に追加した車には弁別器がないため、EFで認識されません。現在、EFはCarのタイプを照会するときにDiscriminator = 'Car'を探しています。

あなたのシードスクリプトを変更し、手動でいくつかのデータを調整します(あなたがDragsterJetCarを追加し、移行にマヌエル・クエリを追加することができます) か、2つのテーブル間のリンクの継承を交換する必要がありますすることができます。

+0

ありがとうございます、なぜ、EFが 'update-database'コマンドで既存のレコードのための識別子を設定しなかったのですか?その理由はありますか、この機能を実装するのを忘れていましたか? – Yoda

+0

EFは更新データベースの前に何があったのか分からないためです。 Discriminatorが「古い」自動車であるべきものを定義することはあなたの仕事です。たぶん彼らは1つのタイプ、多分彼らは他のすべての、多分いくつかの両方があります... –

関連する問題