在将 Entity Framework Core 与 SQL Server 一起使用时,我遇到了一个意想不到的问题。我有一个实体 A 与实体 B 具有一对多关系。 [Table("client")] public class Client { public long ID { get; set; } public string Name { get; set; } public ICollection<Configuration> Configurations { get; set; } = new LinkedList<Configuration>(); }我从数据库中得到实体 A 的实例列表,如下所示:public ICollection<Client> GetAllClients(){ return _dbContext.Clients.ToList();}当我调用这个函数时,我得到一个实例列表,关系中没有实体 B 的实例。为什么没有正确检索到关系中的对象?我还发现,如果我将这行代码添加到函数中,就会按预期检索实体。public ICollection<Client> GetAllClients(){ var test = _dbContext.Configurations.ToList(); return _dbContext.Clients.ToList();}这对我来说毫无意义。我在这里错过了什么?
2 回答
白衣非少年
TA贡献1155条经验 获得超0个赞
相关的引用/集合属性必须预先加载或显式加载。您通常希望使用以下方式急切加载Include
:
var clients = await _context.Clients.Include(x => x.Configurations).ToListAsync();
或者,您可以延迟加载,但这通常不是一个好主意,因为它会导致 N+1 查询问题(即您发出一个查询,然后在迭代时对每个项目进行单独的附加查询,这显然效率很低). 无论如何,延迟加载需要两件事:
引用/集合属性必须具有
virtual
关键字。EF 通过创建实体类的动态代理并覆盖属性 getter 来添加延迟加载功能。当然,覆盖只能在虚拟机上进行。您必须显式添加延迟加载服务:
services.AddDbContext<MyContext>(o => o.UseLazyLoadingProxies() .UseSqlServer(connectionString));
它在您查询配置时也有效,因为 EF 具有对象修复。换句话说,如果它之前已经检索到这些对象并将它们放在对象缓存中,它将自动填充相关的引用/集合属性。否则,如果您不以其他方式加载关系,该属性将保持为空。
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消