データベースからレコードを削除できるようにドメインと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; }
}
私がしたいことは、カテゴリを削除し、削除をすべての子製品にカスケードできるようにすることです。
これがこれを行う唯一の方法ですか?
Category category = new Category() { CategoryId = 1 } ;
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
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
で作成されることを保証するため、関連する製品もすべて削除します。データベースへの追加のラウンドトリップはありません-DELETE
がCategory
= 1の場合のId
ステートメントは1つだけです。
完全にロードされたCategory
(ロードされたProducts
ナビゲーションプロパティを使用)を削除する場合、EFがProduct
ごとに個別の削除ステートメントを作成するため、別の状況が発生する可能性があります。データベースへのN + 1ラウンドトリップがあり、Nはカテゴリ内の製品の数です。 ここ は、EFでカスケード削除がどのように機能するかです。エンティティデザイナーに関連していますが、説明されている原則は同じです。
VS2010自動生成コードから取得:
Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();