gpt4 book ai didi

c# - EntityFramework 显式加载不会检索所有实体

转载 作者:行者123 更新时间:2023-11-30 15:28:33 25 4
gpt4 key购买 nike

我有 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;
}
}

我正在尝试检索与用户帐户关联的所有设备。

我试过用两种不同的方式来做到这一点。

方法 #1 - 在 User 关联属性上调用 Load

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);

(请注意,这不会对数据源执行查询)。

关于c# - EntityFramework 显式加载不会检索所有实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com