これら2つのステートメントの違いは何ですか?
どちらもエンティティを削除する必要があります。
_context.Entry(new Schoolyear { Id = schoolyearId }).State = EntityState.Deleted;
_context.Schoolyears.Remove(new Schoolyear { Id = schoolyearId });
そしてEF拡張を知らない人のために:
_context.Schoolyears.Delete(s => s.Id == schoolyearId);
もっと涼しいですよ:D
それらは同じですが、両方とも失敗します。 EFは内部的にObjectManagerを使用して、EFによって使用されるすべての要素を追跡します。 ObjectManagerへのエントリーは、EFの検索機能を使用するか、 _context.Schoolyears.Add(obj)
を使用してEFに新しいエントリーを追加することによって追加されます。
オブジェクトマネージャに格納されていないエントリを参照すると、通常InvalidOperationException
例外が発生します。以下の動作は似ています。
Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Schoolyears.Remove(year);
_context.SaveChanges();
または
Schoolyear year = context.Schoolyears.Single(x => x.Name == "2013");
_context.Entry(year).State = EntityState.Deleted;
_context.SaveChanges();
しかしEFは最初のアプローチでさらにいくつかのチェックとステータス変更アクティビティを行います。
可能であれば私は常に最初のアプローチを好むでしょう。
ゲームの反対側にはEntityFramework.Extendedがあります。このライブラリはEFコンテキストの一括更新/削除を可能にします。
このライブラリはObjectManagerを使用していません。したがって、使用することが許可されています。
_context.Schoolyears.Delete(s => s.Id == schoolyearId);
ヒント:あなたも使用することができます(推奨)
_context.Schoolyears.Where(s => s.Id == schoolyearId).Delete();
警告 :EFとEF.Extendedでは、オブジェクトを同時に操作しないでください。これは予期しない結果や例外を引き起こす可能性があります。