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

Posted

技术标签:

【中文标题】使用Entity框架从多个表中选择数据,会不会导致不一致的结果【英文标题】:Selecting data from multiple tables using Entity framework, can it cause inconsistence results 【发布时间】:2013-07-12 08:55:55 【问题描述】:

我正在创建以下存储库方法:-

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);

但我担心实体框架将如何获取数据并构造视图模型对象。

    假设用户启动了一个调用 GetCustomer 方法的新对象 因此实体框架将根据.include 开始选择数据

    假设在实体框架构建数据时,刚刚添加了一条新记录,例如:-

    在执行.Include(a => a.SDOrganization) 后,一个新的SDOrganization 带有一个刚刚添加的AssPostalADDress 因此会有一个 AaaPostalAddress 对象在同一对象内没有关联的 SDOrganization。

那么这种情况会发生还是 EF 会处理?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用Entity框架从多个表中选择数据,会不会导致不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从多个表中选择列并在 yii 框架中显示

Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

CoreData多个NSPersistentContainer实例导致Multiple NSEntityDescriptions +entity unable disambiguate的解决

如何从使用实体框架的外键链接的多个表中获取所有数据?

使用 LINQ 和实体框架在一个 SQL 查询中从多个表中提取数据

Entity Framework 基础操作