C# 实体框架尝试在对象为null时再次延迟加载该对象

C# 实体框架尝试在对象为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

我对实体框架处理空对象的方式有一个问题。 下面的示例是一个简单的1到0..1关系。当个人的配置文件不存在时,person对象下的配置文件对象为null

但EF正在尝试再次执行延迟加载获取。因此,将抛出ObjectDisposedException

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。