延迟加载示例? [关闭]
Posted
技术标签:
【中文标题】延迟加载示例? [关闭]【英文标题】:Lazy Loading Examples? [closed] 【发布时间】:2017-03-22 20:14:03 【问题描述】:我正在构建一个基本的 MVC Core Web API 并尝试使用 Entity Framework 进行连接,我遇到了一个叫做“延迟加载”的东西,我似乎无法理解延迟加载是什么在旋转 EntityFramework?
什么时候使用延迟加载,它有什么好处?
【问题讨论】:
Lazy Loading vs Eager Loading的可能重复 【参考方案1】:在我看来,延迟加载是从数据库中自动加载实体或实体集合的过程。
实际上,排序和检索算法正在应用在用户端,而查询获取所有数据。默认情况下,延迟加载功能是开启的,但可以手动关闭,或者您可以构建智能查询,即使用 IQueryable,它在服务器端进行过滤并仅检索那些需要的记录。在实践中,它可以帮助您节省大量时间和资源,防止流量过大和服务器过载
更好的答案在这个网站上-> https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
【讨论】:
谢谢!这就是我想要对其工作原理进行简单分解的全部内容,这对我来说是新领域,所以我只想确保我做对了。【参考方案2】:来自entityframeworktutorial网站:
延迟加载是指延迟加载相关数据,直到您明确要求。例如,Student
类包含 StudentAddress
作为复杂属性。因此,上下文首先从数据库中加载所有students
,然后在我们访问StudentAddress
属性时,它会加载特定student
的地址,如下所示。
using (var ctx = new SchoolDBEntities())
//Loading students only
IList<Student> studList = ctx.Students.ToList<Student>();
Student std = studList[0];
//Loads Student address for particular Student only (seperate SQL query)
StudentAddress address = std.StudentAddress;
上面显示的代码将产生两个 SQL 查询。首先,它将获取所有students
:
SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
然后当控制到达以下行时:
StudentAddress address = std.StudentAddress;
EF 会将第二个查询发送到 db 以加载 StudentAddress
:
exec sp_executesql N'SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[Address1] AS [Address1],
[Extent1].[Address2] AS [Address2],
[Extent1].[City] AS [City],
[Extent1].[State] AS [State]
FROM [dbo].[StudentAddress] AS [Extent1]
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
延迟加载规则:
context.Configuration.ProxyCreationEnabled
应该是真的。
context.Configuration.LazyLoadingEnabled
应该是真的。导航
属性应定义为public
、virtual
。上下文不会做
如果属性未定义为虚拟,则延迟加载(在这种情况下,StudentAddress
应为 virtual
)。
【讨论】:
以上是关于延迟加载示例? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章