c#实体框架加载实体
本文关键字:实体 加载 框架 | 更新日期: 2023-09-27 17:53:57
当我使用实体框架时,它是否为数据库中的所有数据创建对象,例如context.Customers.Load();
,它将创建1000个客户对象,然后5000个订单对象,如果是这样,它不使用大量内存吗?
您应该在需要的时候创建EF上下文,并在完成的时候处理它(工作单元,using
语句)。当然,你应该只查询你需要的——我怀疑你一次请求需要5000个订单。
是的,EF为每个查询创建实体。导航属性没有被加载,你必须包含这些属性或者使用延迟加载(但我会避免这种情况)。
除了L-Three的响应,使用using
语句可能不适合所有情况。例如,对于桌面应用程序,保持连接打开而不是一直打开和关闭连接以查询简单数据更有意义。但重要的是要确保你把它处理掉。一个好地方是在窗户上收听Closing
事件。当触发时,您可以处理DbContext
.
如果你不减少查询的范围,例如:使用where
子句,EF将在你试图访问它们时从数据库加载所有对象。通过执行var query = Db.Users;
,您实际上还没有查询数据库,您只是创建了一个查询,该查询将在您尝试访问数据时发送。如果执行了var query = Db.User.ToList();
,那么是的,查询将被执行,所有User
对象将被查询、映射和返回。如果有100万行,EF会尝试加载100万条记录。在大多数情况下,没有理由从数据库返回所有对象,但总是有例外情况。
子关系根据您如何配置上下文而略有不同。默认情况下,我相信EF使用了一种叫做的东西——惰性加载。惰性加载允许EF用一个特殊的代码覆盖你的属性,直到你尝试访问它们时才会加载子对象。另一方面,您可以执行所谓的快速加载。这允许您在查询中包含所有子对象,以减少对数据库的访问。在大多数情况下,应该使用快速加载,因为您应该知道应用程序将向用户显示什么信息。
如果你只使用惰性加载,你可能会遇到一些麻烦,因为它只是工作,它可能会导致性能问题的道路上创建n+1语句为一些简单的