Asp.net mvc 已加载到DbContext中的对象是否会在延迟加载同一对象期间阻止进一步查询?

Asp.net mvc 已加载到DbContext中的对象是否会在延迟加载同一对象期间阻止进一步查询?,asp.net-mvc,entity-framework,ef-code-first,lazy-loading,dbcontext,Asp.net Mvc,Entity Framework,Ef Code First,Lazy Loading,Dbcontext,我的谷歌搜索引擎很弱,似乎找不到答案,尽管我确信它就在那里 假设您首先使用EF代码进行延迟加载。您有一个Customer实体和一个CustomerType实体。您希望将此信息格式化为网格显示,其中在传递到视图之前,CustomerType.Name显示在模型中。您迭代了10个客户,共有3种客户类型。一旦customertypeA从1个延迟加载的查询加载到上下文中,当EF在customer中遇到相同的CustomerTypeId外键时,它还会发送另一个DB查询吗 我最近学习了懒惰加载和渴望加载。我

我的谷歌搜索引擎很弱,似乎找不到答案,尽管我确信它就在那里

假设您首先使用EF代码进行延迟加载。您有一个
Customer
实体和一个
CustomerType
实体。您希望将此信息格式化为网格显示,其中在传递到视图之前,
CustomerType.Name
显示在模型中。您迭代了10个客户,共有3种客户类型。一旦customertypeA从1个延迟加载的查询加载到上下文中,当EF在customer中遇到相同的CustomerTypeId外键时,它还会发送另一个DB查询吗


我最近学习了懒惰加载和渴望加载。我认为快速加载有助于加快一些缓慢加载的速度,但事实上,这使它们更加缓慢。所以我想知道,在迭代
客户之前,是否可以先执行一个查询,将所有
客户类型加载到DbConext中,以防止在迭代10个客户的情况下进行10个单独的查询?

EF遇到相同的查询时,还会发送另一个DB查询吗客户中的CustomerTypeId外键?

否,如果未加载具有指定id的实体,这只是第一次,加载该实体后,将在数据中跟踪该实体。下一个具有相同id的延迟加载将不会从数据库加载

在执行快速加载时,您将加载导航属性和主实体。这将仅向子实体返回1个带有join语句的查询

当执行延迟加载时,您将在访问子实体时加载它。这将返回1个主查询和每个子查询(如果尚未加载)

另一篇文章提到,延迟加载是成功的,但是你需要记住,为了能够进行延迟加载,你需要保持上下文的活性


更多信息:

您从即时加载和延迟加载中获得的唯一速度差异是消除数据库连接中的延迟。由于您引入了连接,因此急切加载本质上是一个比惰性加载更复杂的查询。但是,通过在一个查询而不是多个查询中提取所有数据,可以消除这些额外查询的请求和响应之间的总延迟。这种理论通常是正确的,即来自多个简单查询的额外网络通信比加载单个更复杂查询所需的额外数据库处理时间要长

然而,每一条规则都有例外。如果您急于加载包含数百万行的大型表,那么很可能服务器构建结果集的实际时间要比延迟加载所需结果的时间长。急切的装载不是一颗神奇的子弹;它的使用需要根据具体情况进行评估


尽管如此,如果您的即时加载比延迟加载花费的时间更长,那么实际上最好使用存储过程进行研究,而不是仅仅返回到延迟加载。我发现很少有实例表明延迟加载实际上是最有效的方式。

这实际上并没有回答我的问题。我对这一部分很感兴趣
,不过,如果您的“渴望加载”比“延迟加载”花费的时间更长,例如,有两个客户,其中一个客户类型由两个客户引用,是否会返回4条记录(2个客户,2个客户类型)或3条记录(2个客户,1个客户类型)?(因为我不知道如何检查查询返回的实际blob/数据)@YuliamChandra:两者都有。数据库中的实际结果集具有两个与同一客户类型行关联的客户。从技术上讲,这只是两张唱片,但它就像4浓缩成2。然而,实体框架将实例化2个
Customer
实例,只有1个
CustomerType
实例,这两个客户都将引用。嗯,好吧,那么我必须尝试一下我的想法,看看是否可以获得一些性能改进。与急切加载相比,它将导致两个较不复杂的查询和较小的数据集,并且比使用惰性加载的查询更少(在我的问题示例中,albiet只是1个,但在现实中可能更简单)。您是否知道即使在POCO上没有显示FK属性,此操作是否仍然有效?我假设即使POCO没有公开它,EF仍然在幕后拥有它。@DOTang,如果没有FK引用(只有FK值),我认为对于急切或懒惰的加载都没有什么可加载的。我只是说FK属性没有在POCO上公开。所以customer上只有一个customerType对象,而不是customerTypeId,但我认为这并不重要。