1

1 つのアプリは asp.net で、もう 1 つはバックグラウンドで実行されている Windows サービスです。

バックグラウンドで実行されている Windows サービスは、データベースでいくつかのタスク (読み取りと更新) を実行していますが、ユーザーは asp.net アプリを介してデータベースで他の操作を実行できます。たとえば、Windowsサービスでは、条件を満たすレコードを収集してから、次のように繰り返します。

IQueryable<EntityA> collection = context.EntitiesA.where(<condition>)
foreach (EntityA entity in collection)
{
  // do some stuff
}

では、後でループ反復で使用されるレコードをユーザーが変更した場合、そのレコードのどの値が EF で考慮されるのでしょうか? 実行時に取得されたオリジナル:

context.EntitiesA.where(<condition>)

またはユーザーによって変更され、データベースにある新しいものですか?

私の知る限り、反復中に EF は要求に応じて、つまり 1 つずつ取得されるため、次の反復のために次のレコードを読み取るとき、このレコードは から収集されたものに対応します。

context.EntitiesA.where(<condition>)

またはデータベースにあるもの(ユーザーが変更したもの)?

ありがとう!

4

3 に答える 3

2

これが EF でどのように機能するかという点で、ここで重要なプロセスがいくつかあります。

  1. クエリは列挙に対してのみ実行されます (これは、クエリのマテリアライゼーションと呼ばれることもあります)。この時点で、クエリ全体が実行されます。
  2. 上記の例では、遅延読み込みはナビゲーション プロパティにのみ影響します。where ステートメントの結果セットは、一度にプルダウンされます。

それで、あなたの場合、これはどういう意味ですか:

//nothing happens here you are just describing what will happen later to make the 
// query execute here do a .ToArray or similar, to prevent people adding to the sql 
// resulting from this use .AsEnumerable
IQueryable<EntityA> collection = context.EntitiesA.where(<condition>); 
//when it first hits this foreach a 
//SELECT {cols} FROM [YourTable] WHERE [YourCondition] will be performed
foreach (EntityA entity in collection)
{
    //data here will be from the point in time the foreach started (eg if you have updated during the enumeration in the database you will have out of date data)
    // do some stuff
}
于 2013-06-20T20:35:18.433 に答える
0

これが発生する可能性があることを本当に懸念している場合は、事前に id のリストを取得し、DbContextそれぞれに新しいものを使用して個別に処理します (または、10 個のバッチごとに処理します)。何かのようなもの:

IList<int> collection = context.EntitiesA.Where(...).Select(k => k.id).ToList();
foreach (int entityId in collection)
{
    using (Context context = new Context())
    {
        TEntity entity = context.EntitiesA.Find(entityId);
        // do some stuff
        context.Submit();
    }
}
于 2013-06-20T20:36:04.223 に答える