回答:
Entity Framework 6では、削除アクションはRemove
です。ここに例があります
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();
Attach
?なぜRemove
そしてただではないのSaveChanges
ですか?
@Nixと同じですが、強く型付けされるように少し変更されています。
クエリを実行したくない場合は、エンティティを作成してから削除します。
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.DeleteObject(customer);
context.SaveChanges();
ここで同様の質問。
Entity Frameworkには、EntityFramework-Plus(拡張ライブラリ)があります。
NuGetで利用できます。それからあなたは次のようなものを書くことができます:
// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Delete();
また、一括削除にも役立ちます。
私のプロジェクトの1つで次のコードを使用しています。
using (var _context = new DBContext(new DbContextOptions<DBContext>()))
{
try
{
_context.MyItems.Remove(new MyItem() { MyItemId = id });
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
if (!_context.MyItems.Any(i => i.MyItemId == id))
{
return NotFound();
}
else
{
throw ex;
}
}
}
このようにして、指定されたIDのアイテムを削除しようとしたときに例外が発生した場合にのみ、データベースを2回クエリします。次に、アイテムが見つからない場合は、意味のあるメッセージを返します。それ以外の場合は、例外をスローするだけです(さまざまな例外タイプのさまざまなcatchブロックを使用して、より適切な方法でこれを処理したり、ifブロックを使用してカスタムチェックを追加したりできます)。
[Entity Framework Coreを使用したMVC .Net Core / .Net Coreプロジェクトでこのコードを使用しています。]
生のSQLクエリは私が思う最も速い方法です
public void DeleteCustomer(int id)
{
using (var context = new Context())
{
const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}";
var rows = context.Database.ExecuteSqlCommand(query,id);
// rows >= 1 - count of deleted rows,
// rows = 0 - nothing to delete.
}
}
dwkdの答えは、この例外を見た場合を除いて、Entity Frameworkコアで主に機能しました。
InvalidOperationException:{'Id'}の同じキー値を持つ別のインスタンスが既に追跡されているため、エンティティタイプ 'Customer'のインスタンスは追跡できません。既存のエンティティをアタッチするときは、特定のキー値を持つエンティティインスタンスが1つだけアタッチされるようにしてください。'DbContextOptionsBuilder.EnableSensitiveDataLogging'を使用して、競合するキー値を確認することを検討してください。
例外を回避するために、コードを更新しました。
Customer customer = context.Customers.Local.First(c => c.Id == id);
if (customer == null) {
customer = new Customer () { Id = id };
context.Customers.Attach(customer);
}
context.Customers.Remove(customer);
context.SaveChanges();
この回答は、ASP.NET MVC 5 Fundamentalsという名前のScott Allenのコースから実際に出されたものです。すでにここにあるどの回答よりも少しシンプルで直感的だと思うので、共有したいと思いました。また、Scott Allenおよび私が行った他のトレーニングによれば、findメソッドはデータベースからリソースを取得するための最適化された方法であり、既に取得されている場合はキャッシュを使用できます。このコードでは、コレクションはオブジェクトのDBSetを指します。オブジェクトは、任意の汎用オブジェクトタイプにすることができます。
var object = context.collection.Find(id);
context.collection.Remove(object);
context.SaveChanges();