1

次のメソッドを使用して、Personテーブル内のユーザーにフラグを付けて処理できるようにします。他のスレッドが同じ行で動作しないように、これらのユーザーには「処理中」のフラグを立てる必要があります。

SQL Management Studioでは、クエリは期待どおりに機能します。アプリケーションでメソッドを呼び出すと、その人の行を受け取りますが、ステータスは古いものです。

ステータスは、Person以外の多くのナビゲーションプロパティの1つであり、このクエリが返されるとき、プロキシオブジェクトとして返される唯一のプロパティです。

// This is how I'm calling it (obvious, I know)
var result = PersonLogic.GetPeopleWaitingInLine(100); 

// And Here is my method.
public IList<Person> GetPeopleWaitingInLine(int count)
{
    const string query =
        @"UPDATE top(@count) PERSON
        SET PERSON_STATUS_ID = @inProcessStatusId
        OUTPUT INSERTED.PERSON_ID,
               INSERTED.STATUS_ID
        FROM PERSON
        WHERE PERSON_STATUS_ID = @queuedStatusId";

    var queuedStatusId = StatusLogic.GetStatus("Queued").Id;
    var inProcessStatusId = StatusLogic.GetStatus("In Process").Id;

    return Context.People.SqlQuery(query,
               new SqlParameter("count", count),
               new SqlParameter("queuedStateId", queuedStateId),
               new SqlParameter("inProcessStateId", inProcessStateId)
}

// update | if I refresh the result set then I get the correct results
// but I'm not sure about this solution since it will require 2 DB calls
Context.ObjectContext().Refresh(RefreshMode.StoreWins, results);
4

1 に答える 1

1

私はそれが古い質問であることを知っていますが、これは誰かを助けることができます。

クエリにグローバルコンテキストを使用しているようです。EFはキャッシュ情報を保持するように設計されています。常に新しいデータが必要な場合は、新しいコンテキストを使用してデータを取得する必要があります。このように:

using (var tmpContext = new Contex())
{
    // your query here
} 

これにより、コンテキストが作成され、リサイクルされます。これは、キャッシュが保存されておらず、次にキャッシュからではなくデータベースから新しいデータを取得することを意味します。

于 2016-03-06T12:02:05.430 に答える