1

Entity Framework で常にデータの整合性を維持するための最良の方法と見なされるものについて、コンセンサスはありますか。つまり、エンティティを追加または削除するとき、ロードされたモデルが最新であり、背後のデータベースで何も変更されていないことを確認するにはどうすればよいですか?

ほとんどの場合、私にとってうまくいくと思われる大まかな方法​​は、セッション間でコンテキストをリロードすることです。つまり、永続的なモデルを持たず、エラーが発生した場合にリロード/リフレッシュします。これは、データの衝突が少ない場合には機能するようですが、さまざまなサービスで多くの変更が発生すると非常にコストがかかります。ディスク上のデータ/行が変更されたかどうか、またはこの更新を自動化するイベント、つまり特定のテーブル/行のサブスクライバーを更新するかどうかを照会するフラグはありますか?

4

2 に答える 2

2

おそらく楽観的並行性が必要です。EF は、コミットする前にデータの変更を自動的にチェックし、現在のコンテキスト外でデータが変更された場合は例外をスローできます。http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-applicationを参照してください。

于 2012-11-06T21:26:50.017 に答える
0

EF の同時実行性を使用すると、すばらしいことができます。

具体的には、エンティティ フレームワークがスローする DbConcurrencyException に自動的にフックするために MVC プロジェクトで使用できる属性 HandleConcurrencyExceptionAttribute があります。 https://github.com/adamtuliper/EF5-for-Real-Web-Applications

Web フォーム (または win フォーム/wpf) を使用している場合は、手動で確認する必要があります。Webforms プロジェクトで DbConcurrencyException を検索します

だから基本的に:

  1. データベースにrowversionフィールドがあり、「タイムスタンプ」と呼びます
  2. [タイムスタンプ] を持つようにエンティティ フィールドを設定します。

[Timestamp] public byte[] Timestamp { get; set; }

  1. EF を保存すると、更新中の行に現在のタイムスタンプがあることが保証されます。更新された行数 = 0 の場合、行が存在しないか変更されたため、例外がスローされます。SQL Server は、最後のユーザーが変更を保存したときに行バージョンを自動的にインクリメントします。

実際の動作を見たい場合は、次のビデオの最後を参照してください: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/DEV215 同時実行について簡単に説明し、簡単なデモを用意しています。

質問の 2 番目の部分については、SqlCacheDependency クラス http://msdn.microsoft.com/en-us/library/ms178604(v=vs.100).aspx があります。最近、MSDN にも記事がありました。良い。

于 2012-11-06T22:01:04.633 に答える