2

ObjectDisplay私は2つの関連するテーブルで構成される ビューを持っています:ObjectStateStateの状態を表し、ビューはそれぞれObjectの最新のものから詳細の一部を取得します。StateObject

この情報を表示しているページで、ユーザーはいくつかのコメントを入力できます。これにより、新しいが作成されますState。新しいを作成した後、すぐにfromをStateプルして送り返し、部分ビューにドロップして、ページのグリッドに置き換えます。ObjectObjectDisplayObject

// Add new State.
db.States.Add(new State()
{
    ObjectId = objectId,
    Comments = comments,
    UserName = username
});

// Save the changes (executes all of the above).
db.SaveChanges();

// Return the new Object information.
return db.Objects.Single(c => c.ObjectId == objectId);

私のdbトレースによると、Single呼び出しは呼び出しの約70ミリ秒後SaveChangesに発生し、同じSPIDで発生します。

ここで問題が発生します 。データベースのデフォルト値はRecordDateinです。日付は自分で指定しませんStateGETUTCDATE()私が見ているのは、返さObjectれたものには、古いものと古いものの新しい情報のが含まれているということです。StateRecordDateStateCommentsStateStateObject返品されたものには古い情報が含ま れていることがわかりStateます。ページを更新すると、正しい情報はすべてそこにありますが、データベース/EFからの最初の呼び出しで間違った情報が返されます。

だから..何が間違っている可能性がありますか?ビューが十分に速く更新されていない可能性がありますか?EFで何かが起こっている可能性がありますか?どこから探し始めたらいいのかわからない。

4

2 に答える 2

1

Object以前に同じエンティティを同じ に読み込んでいた場合DbContext、EF は古い値を持つキャッシュされたインスタンスを返し、SQL から返された値を無視します。

最も簡単な解決策は、エンティティを返す前に再読み込みすることです。

var result = db.Objects.Single(c => c.ObjectId == objectId);
db.Entry(result).Reload();
return result;
于 2013-03-22T16:29:25.843 に答える
0

これは確かに奇妙です。SQL Server では、ビューは既定では永続化されないため、基になるデータの変更がすぐに表示されます。効果的にクエリを永続化するビューにクラスター化インデックスを作成できますが、その場合、データは同期的に更新されるため、変更がすぐに表示されます。

スナップショット分離レベルで作業している場合、変更はすぐに他の SPID に表示されない可能性がありますが、同じ SPID を使用していてスナップショット分離を使用していないため、これも原因ではありません。

この時点で残っているのは、アプリケーション層だけです。実際に呼び出しスタックの上位にある Single 呼び出しの結果を使用していますか、それともどこかで失われていますか。ページの更新では別のコード パスが使用されていると思われます。

于 2013-03-21T21:24:42.540 に答える