使用Entity框架从多个表中选择数据会导致不一致的结果

时间:2013-07-12 08:55:56

标签: asp.net-mvc entity-framework-4.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;
}

我有以下Action方法,它将调用上面的存储库方法: -

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

但我对实体框架如何获取数据并构建View模型对象感到担忧。

  1. 假设用户启动一个调用GetCustomer方法的新对象
  2. 因此,实体框架将根据.include
  3. 开始选择数据
  4. 让我们说当实体框架正在构建数据时,刚刚添加了一条新记录,例如: -

    • 执行.Include(a => a.SDOrganization)后,新SDOrganization AssPostalADDress刚刚添加
    • 所以会有一个AaaPostalAddress对象在同一个对象中没有关联的SDOrganization。
  5. 所以可能会发生这种情况或EF会处理这个问题吗?

1 个答案:

答案 0 :(得分:0)

这里没有之前或之后。 EF读取所有包含和所有内容并构建查询表达式。 当您在该表达式上调用SingleOrDefault()时,该表达式将转换为SQL并在数据库中立即执行。

您要求的是事务隔离级别 - 您在并发环境中从SQL Server获取的数据:请参阅此链接以获取有关该主题的介绍:http://msdn.microsoft.com/en-us/library/ms378149.aspx