当我使用实体框架它创建对象为数据库中的所有数据例如context.Customers.Load();
它会创建1000个客户对象,然后5000订单对象,如果是这样,它不会使用很多记忆?c#实体框架加载实体
1
A
回答
2
您应该从您需要的时刻创建EF上下文,并从您完成的那一刻开始处理它(工作单元,using
语句)。当然,你应该只查询你需要的东西 - 我怀疑你在一个请求中需要5000个订单。
是的,EF为每个查询创建实体。导航属性没有加载,你必须专门包含这些或使用延迟加载(但我会避免这种情况)。
1
除了L-Three的回复之外,使用using
声明可能不适合所有情况。例如,对于桌面应用程序,保持连接打开而不是始终打开和关闭连接以查询简单数据更有意义。确保在完成时处理它很重要。一个好的地方是听窗口上的Closing
事件。触发时,您可以处置DbContext
。
如果您不缩小查询的范围,例如:使用where
子句,EF会在尝试访问数据库时加载数据库中的所有对象。通过执行var query = Db.Users;
,您实际上并未查询数据库,您只是创建了一条查询,当您尝试访问数据时将发送该查询。如果你做了var query = Db.User.ToList();
,那么是的,查询将被执行,并且所有User
对象将被查询,映射并返回。所以如果你有100万行,EF会尝试加载100万条记录。在大多数情况下,没有理由返回数据库中的所有对象,但始终存在边缘案例。
取决于您如何配置上下文,子女关系有点不同。默认情况下,我相信EF使用了一种叫做的延迟加载。 延迟加载允许EF用特殊代码覆盖您的属性,直到您尝试访问它们时才会加载子对象。在另一方面,你可以做什么叫做急切加载。这使您可以在查询中包含所有子对象,从而减少访问数据库的次数。在大多数情况下,应该使用急切加载,因为您应该知道应用程序将显示给用户的信息。
如果你只曾经使用延迟加载你可以得到一些麻烦,因为它只是工作,它可以通过一些简单的创建N + 1周的语句会导致性能问题的道路。
相关问题
- 1. 实体框架加载相关实体
- 2. 实体框架 - 加载嵌套实体
- 3. 实体框架加载
- 4. 实体框架懒加载
- 5. 实体框架 - 使用子实体加载实体
- 6. C#实体框架6加载相关实体
- 7. 实体框架 - 延迟加载,加载子实体问题
- 8. 实体框架c#
- 9. 实体框架c#
- 10. C#实体框架
- 11. C#实体框架:减去实体
- 12. 实体框架:ObjectSet.AddObject不添加实体?
- 13. 实体框架 - 添加子实体
- 14. 实体框架 - 当添加DbUpdateException实体
- 15. 实体框架添加新的实体
- 16. 实体框架:实体
- 17. 实体框架实体
- 18. 实体框架实体json
- 19. 实体框架添加实体也添加子实体
- 20. 延迟加载,延期加载和实体加载实体框架
- 21. 从实体框架中的父实体获取子实体c#
- 22. 如何加载相关的实体与实体框架核心
- 23. 使用实体框架加载嵌套实体/集合
- 24. 使用Moq,NUnit和实体框架重新加载实体
- 25. 实体框架在删除时实体被加载时级联
- 26. 实体框架:加载多对一实体
- 27. 实体框架 - 从以前加载的实体释放内存
- 28. 实体框架 - 渴望加载相关实体
- 29. 实体框架 - 急切加载相关实体
- 30. 实体框架懒加载不正确实体
第一MSDN上:“当的Windows Presentation Foundation(WPF)或Windows窗体的工作,每使用形式的上下文实例,就可以使用更改跟踪功能这方面提供了”,所以我使用WPF,和什么如果我需要所有客户的列表(DataGrid)或订单 – Lerner
然后确保您的问题包含足够的信息,我们无法猜测。对我而言,您的WPF应用程序直接访问数据库听起来很诡异。即使那样,你也不需要5000个订单。 –
嗨,它不是数字5000,我想知道的是,如果EF在表中查询我创建的表中的每个原料的内存对象,并且你没有回答我,如果我需要一个所有客户的列表是什么?谢谢 – Lerner