C# 实体框架尝试在对象为null时再次延迟加载该对象
我对实体框架处理空对象的方式有一个问题。 下面的示例是一个简单的1到0..1关系。当个人的配置文件不存在时,person对象下的配置文件对象为null 但EF正在尝试再次执行延迟加载获取。因此,将抛出ObjectDisposedExceptionC# 实体框架尝试在对象为null时再次延迟加载该对象,c#,entity-framework,C#,Entity Framework,我对实体框架处理空对象的方式有一个问题。 下面的示例是一个简单的1到0..1关系。当个人的配置文件不存在时,person对象下的配置文件对象为null 但EF正在尝试再次执行延迟加载获取。因此,将抛出ObjectDisposedException public void Test() { Person person = null; using (var ctx = new MainContext()) { person = ctx.Persons
public void Test()
{
Person person = null;
using (var ctx = new MainContext())
{
person = ctx.Persons
.Include(c => c.Profile);
.FirstOrDefault(p => p.Name == "Ben");
}
// ObjectDisposedException is throw here if Profile doesn't exist
var profile = person.Profile;
}
似乎EF无法区分“不存在”和“尚未获取”。我现在拥有的最佳解决方案是禁用延迟加载
Configuration.LazyLoadingEnabled = false;
但这会隐藏我想看到的所有ObjectDisposedException,因为有时我可能会忘记放入Include,现在它们都变成null
有更好的处理方法吗?执行左外联接,这将返回所有人员,无论他们是否有个人资料
var query = (from p in ctx.Persons
join pr in ctx.Profiles on p equals pr.PersonId into gj
from subpr in gj.DefaultIfEmpty()
where p.Name == "Ben"
select p).FirstOrDefault();
如果只处理空对象,可以在类构造函数中初始化对象,如下所示:
public Person
{
this.Profile = new Profile();
}
它抛出异常的原因是,延迟加载仅在您需要时发生,而不是在您执行include时发生 当你告诉你的代码你“需要”在你的使用范围之外的配置文件时,EF没有更多的上下文来获取数据,你收到了错误 看一看 或者 如果您执行以下操作,您的代码应该可以工作:
public void Test()
{
Person person = null;
using (var ctx = new MainContext())
{
person = ctx.Persons
.Include(c => c.Profile);
.FirstOrDefault(p => p.Name == "Ben");
// code inside the using
var profile = person.Profile;
}
}
}
我希望这有帮助。:-) 如果执行
.Include(..).AsNoTracking().FirstOrDefault()
,会发生什么?是的,AsNoTracking()成功了!谢谢SimpleVar!当懒惰压倒一切时,感谢你的回答。我知道把最后一段代码放在using中是可行的。但这是不可行的,因为概要文件将在其他地方调用。我正在寻找一种方法来避免这种情况下的延迟加载。事实上,当我放入Include语句时,它应该进行急切加载。为什么它在值为null时再次执行延迟加载?我无法自己创建对象。EF框架检索数据并创建实例。配置文件对象可以为null,也可以不为null。所以我不能自己创建这个实例,我的问题不是人是否被返回。但是Person实例下的配置文件为null。