web-dev-qa-db-ja.com

エンティティフレームワークコードは最初にカスケードで削除されます

データベースからレコードを削除できるようにドメインとLINQステートメントを設定するにはどうすればよいですか?

public class Category    {
    public int CategoryId { get; set; }
    public string Name { get; set; }

    public List<Product> Products{ get; set; }

}
public class Product {
    public int ProductId { get; set; }
    public string Name { get; set; }

    public int CategoryId {get; set; }
    public Category Category{ get; set; }
}

私がしたいことは、カテゴリを削除し、削除をすべての子製品にカスケードできるようにすることです。

  1. ドメインで必要なその他の追加属性はありますか?
  2. 往復せずにオブジェクトを削除するLINQステートメントとは何ですか? (選択したくありません。直接削除するだけです)。

これがこれを行う唯一の方法ですか?

Category category = new Category() {  CategoryId = 1   } ; 
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
26
Shawn Mclean

EF 4.1を意味するEFコードを最初に説明しましたが、EF 4でオブジェクトを削除する例を示しました。データベースからロードせずにEF 4.1でオブジェクトを削除する正しい方法は次のとおりです。

var category = new Category() { CategoryId = 1 };
context.Categories.Attach(category);
context.Categories.Remove(category);
context.SaveChanges();

デフォルト設定の構成で何も変更しなかった場合、OneToManyCascadeDeleteConventionsはすべての1対多の関係がON CASCADE DELETEで作成されることを保証するため、関連する製品もすべて削除します。データベースへの追加のラウンドトリップはありません-DELETECategory = 1の場合のIdステートメントは1つだけです。

完全にロードされたCategory(ロードされたProductsナビゲーションプロパティを使用)を削除する場合、EFがProductごとに個別の削除ステートメントを作成するため、別の状況が発生する可能性があります。データベースへのN + 1ラウンドトリップがあり、Nはカテゴリ内の製品の数です。 ここ は、EFでカスケード削除がどのように機能するかです。エンティティデザイナーに関連していますが、説明されている原則は同じです。

41
Ladislav Mrnka

VS2010自動生成コードから取得:

Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();
3
Vasil Popov