EF6

1
でデータベースのレコードを削除する

私たちは、私が私のテーブルを生成し、次のクラスを持っていると仮定しましょう:私のDbContextクラスでEF6

public class Car 
{ 
    public Guid Id { get; set; } 
    public Guid OwnerId { get; set; } 
    public string Color { get; set; } 

    public virtual Owner Owner { get; set; } 
} 


public class Owner 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    public ICollection<Car> Cars { get; set; } 
} 

私は車を除去するための方法を作成しています。私は、次の2つのアプローチの違いが何であるかを知っているように、それが重要ならば、私が使用して接近するでしょう:

アプローチ1:

public class CarDbContext : DbContext 
{ 
    public DbSet<Car> Car { get; set; } 
    public DbSet<Ownerr> Owner { get; set; } 

    public CarDbContext(string cs) : base (cs) {} 

    public void RemoveCar(Car car) 
    { 
     Car.Attach(car); 
     Car.Remove(car); 
     SaveChanges(); 
    } 
} 

アプローチ2:

public class CarDbContext : DbContext 
{ 
    public DbSet<Car> Car { get; set; } 
    public DbSet<Ownerr> Owner { get; set; } 

    public CarDbContext(string cs) : base (cs) {} 

    public void RemoveCar(Car car) 
    { 
     Entry(car).State = EntityState.Deleted; 
     SaveChanges(); 
    } 
} 

何場合をI車は依存しているので、所有者を今すぐ削除したい、私は今問題を使用するアプローチですか?

答えて

1

何以下の2つのアプローチの違いがあり、それが重要な場合、私はあなたが実際にあなたが上記の持っているものに似ているで作業しているコードを仮定し

使用接近するには、大きな違いがありませんあなたがすぐに貯蓄しており、あなたに扶養家族がいないので、私はまだあなたが未来を知りたいと思うかもしれない少しの違いがあると信じています。

アプローチ1:削除()が呼び出されると、EFは、変更の追跡を停止します削除済みとしてエンティティをマークし、任意の関連企業と関係を持ついくつかの追加作業を行う

の保存、削除、取り付けます。

アプローチ2:削除されたよう

はあなたのエンティティがマークされ、削除済みとしてマークします。 SaveChanges()が呼び出されると、EFは削除クエリを生成して実行します。外部キー違反が起こっていないと仮定すると、レコードはなくなります。私は、上記の追加作業が行われたとは思わないが、私は思い出していない。

車が依存しているので、オーナーを今すぐ削除したい場合、私は今問題を使用しますか?

この部分については、thisの回答で、さまざまなアプローチがかなりうまく説明されており、私が説明したことからさらに明確に説明することができます。

+0

明らかに、私が 'Owner.Remove(owner)'を呼び出すと、その所有者に依存するCarテーブルのレコードがあるため、コードがクラッシュします。 'Entry(owner).State = EntityState.Deleted;を呼び出すと、所有者が削除され、所有者がいない車のテーブルに孤立したレコードが残ってしまいます。これは正しいです?私はこれを、あなたが証明したリンクで読んだところに基づいています。 – Bojan

+0

これは、データベースキーの設定方法とエンティティの設定方法によって異なります。 Remove()は子エンティティを削除するか、外部キーをnullにすることで子エンティティを処理する必要があるため例外がスローされる可能性は低いEntityState.Deletedによってデータベースに例外がスローされます –

+0

最良の選択肢は、あなたのコンテキストがSQLのローカルインスタンスを指し示していることを確認し、それぞれのアプローチを試して動作を検証してください –