web-dev-qa-db-ja.com

EF 6.1.1を使用してテーブルから単一のレコードを削除する方法

使っています Entity Framework 6.1.1.

わたし deleting single record from table以下のとおりですが、それが唯一の方法なのか、それとも効率的な方法でさらに書き直すことができるのかはわかりません。

誰かがコメントを共有できますか?

理由:以前の投稿の多くのソリューションがEF 4.0を参照しており、最新バージョン6.1.1を使用していないため、私は尋ねています。

Guid studentId = student.Id;
StudentReportDetail stuDetails = _context.StudentReportDetail.Find(studentId);
if (stuDetails != null)
{
    _context.StudentReportDetail.Remove(stuDetails);
    _context.SaveChanges();
}
15
immirza

EF 4とEF 6の間でエンティティを削除する方法に変更はありません。EntityFrameworkを使用してエンティティを削除するには、RemoveDbSetメソッドを使用する必要があります。 Remove既存のエンティティと新しく追加されたエンティティの両方で機能します。

  • 追加されたがまだデータベースに保存されていないエンティティでRemoveを呼び出すと、エンティティの追加がキャンセルされます。エンティティは変更トラッカーから削除され、DbContextによって追跡されなくなります。

  • 変更追跡されている既存のエンティティでRemoveを呼び出すと、次にSaveChangesが呼び出されたときにエンティティが削除対象として登録されます。

データベースからのロードによる削除

質問で示した例のように、まず既存のエンティティをコンテキストからロードして削除する必要があります。 Idがわからない場合は、以下に示すようにクエリを実行して、最初に見つけることができます。

    var report= (from d in context.StudentReportDetail
               where d.ReportName == "Report"
               select d).Single();

    context.StudentReportDetail.Remove(report);
    context.SaveChanges();

データベースからロードせずに削除

エンティティを削除する必要があるが、まだメモリにない場合、削除するためだけにデータベースからそのエンティティを取得するのは少し非効率的です。削除するエンティティのキ​​ーがわかっている場合は、削除するエンティティを表すstubを添付してから、このstubを削除できます。 stubは、キー値が割り当てられているエンティティのインスタンスです。 エンティティの削除に必要なのはキー値だけです

var toDelete = new StudentReportDetail {Id = 2 };

context.StudentReportDetail.Attach(toDelete);
context.StudentReportDetail.Remove(toDelete);
context.SaveChanges();

他の方法は、エンティティの状態をDeletedに変更することです。DbContextにはEntryおよびEntry<TEntity>というメソッドがあり、これらのメソッドは特定のエンティティのDbEntityEntryを取得し、エンティティに関する情報へのアクセスを提供し、実行可能なDbEntityEntryオブジェクトを返します。エンティティに対するアクション。これで、エンティティの状態をEntityState.Deletedに変更するだけで、コンテキストで削除操作を実行できます。

var toDelete = new StudentReportDetail {Id = 2 };
context.Entry(toDelete).State = EntityState.Deleted;  
context.SaveChanges();  

サードパーティライブラリの使用

別の方法がありますが、サードパーティのライブラリ EntityFramework Plus を使用しています。インストールできるナゲットパッケージがあります。バッチ削除操作を使用できます。

context.StudentReportDetail
    .Where(u => u.Id== stuDetails)
    .Delete();
32
octavioccl