EntityFramework显式加载不会检索所有实体
作者:互联网
我有2个类别(用户和设备),如下所示.
public class User {
public int UserId { get; set; }
public virtual ICollection<Device> Devices { get; set; }
...
}
public class Device {
public int UserId;
public virtual User User { get; set; }
...
}
我为这两个实体中的每个实体都有一个存储库,并且已经在数据上下文中禁用了延迟加载,就像这样.
public class MyDbContext : DbContext
{
public MyDbContext()
: base(name=MyDbContext)
{
this.Configuration.LazyLoadingEnabled = false;
}
}
我正在尝试检索与用户帐户关联的所有设备.
我尝试以2种不同的方式进行此操作.
方法1-调用“用户”关联属性上的负载
using (MyDbContext dbContext = new MyDbContext())
{
// performing some database operations ...
var user = dbContext.Users.Find(8);
// do some operations
if (user.Devices == null or user.Devices.Count() ==0)
dbContext.Entry(user).Collection(u => u.Devices).Load();
var devices = user.Devices;
}
方法#2-使用where从设备集中检索
using (MyDbContext dbContext = new MyDbContext())
{
// performing some database operations ...
var user = dbContext.Users.Find(8);
// do some operations
if (user.Devices == null or user.Devices.Count() ==0)
var devices = dbContext.Devices.Where(d => d.UserId == user.UserId).ToList();
}
由于某种原因,方法1并不总是检索所有设备,但是方法2却检索所有设备!有人可以解释一下我在做什么错吗?
我启动了SQL Server Profiler,以查看是否做错了什么.两种方法所生成的查询是相同的.因此,我对自己做错的事情感到很困惑!
解决方法:
Can someone please explain me what I am doing wrong?
我无法解释您为什么会遇到自己的经历,但是我个人不使用Find()或Load(),因为这些方法在与本地上下文缓存一起使用方面很复杂.因此,我建议以下查询:
var user = dbContext.Users
.Include(u => u.Devices);
.FirstOrDefault(u => u.id = 8);
由于您仅检索单个用户,因此没有Cartesian问题.该查询将在单个语句中为用户和与该用户关联的所有设备填充上下文.
如果以后确实需要在所有设备上使用单独的变量,请执行以下操作:
var devices = user.Devices;
关于我的答案的重要说明是,因为我通常在Web环境中处理Entity Framework,所以我的代码不断创建/处理上下文,因此Entity Framework上的本地缓存几乎没有用.对于非无状态应用程序(Winforms / WPF),这可能不是最佳解决方案.
根据您的评论更新
Is there any other way of loading at a later time?
如Brendan Green’s Comment所述,您可以使用:
var devices = dbContext.Devices
.Where(w => w.UserId == 8);
(请注意,这不会对数据源执行查询).
标签:lazy-loading,c,entity-framework 来源: https://codeday.me/bug/20191029/1958099.html