1

次のリポジトリメソッドを作成しています:-

public AccountDefinition GetCustomer(int id)
{
    var c = entities.AccountDefinitions.Where(p => p.ORG_ID == id)
               .Include(a => a.SDOrganization)
               .Include(a2 => a2.SiteDefinitions)
               .Include(a3 => a3.SDOrganization.AaaPostalAddresses)
               .Include(a4 => 
                    a4.SiteDefinitions
                        .Select(a5 => 
                            a5.DepartmentDefinitions
                                .Select(a6 => a6.SDUsers
                                            .Select(a7 => a7.AaaUser.AaaContactInfoes)
                        )
                    )
                )
                .SingleOrDefault();
    return c;
}

そして、私は上記のリポジトリメソッドを呼び出す次のアクションメソッドを持っています:-

public ActionResult Details2(int id = 0)
{
    //  CustomerDetails cd = repository.GetCustomer(id);
    AccountDefinition cd = repository.GetCustomer2(id);
    return View("copy",cd);
}

しかし、エンティティ フレームワークがどのようにデータを取得し、View-model オブジェクトを構築するかについて懸念があります。

  1. ユーザーが GetCustomer メソッドを呼び出す新しいオブジェクトを開始するとします。
  2. したがって、エンティティ フレームワークは、次のようにデータの選択を開始します。.include
  3. エンティティ フレームワークがデータを構築している間に、次のような新しいレコードが追加されたとします。

    • を実行 した後、where が追加され.Include(a => a.SDOrganization)た newSDOrganizationAssPostalADDress
    • そのため、同じオブジェクト内に SDOrganization が関連付けられていない AaaPostalAddress オブジェクトが存在します。

このケースが発生する可能性がありますか、またはEFがこれを処理しますか?

4

1 に答える 1

0

ここに前後はありません。EF は、すべての include と where を読み取り、クエリ式を作成します。その式は SQL に変換され、その式を呼び出すとすぐにデータベースで実行されますSingleOrDefault()

あなたが求めているのは、トランザクションの分離レベルです - 同時実行環境で SQL Server からどのデータを取得しますか: そのトピックの紹介については、このリンクを参照してください: http://msdn.microsoft.com/en-us/library /ms378149.aspx

于 2013-07-12T11:00:26.660 に答える