我发现了许多其他帖子,但他们没有面临完全相同的问题。他们使用的代码略有不同。所以我认为值得回顾一下。
我首先使用 EF6 代码,并创建了一个具有一些导航属性的客户端实体。
我将仅发布相关代码,考虑还有更多属性和外键,但与问题无关。模型生成正常。
public class Client
{
public Client()
{
JobsExperiences = new Collection<JobsExperience>();
CapacitationCourses = new Collection<CapacitationCourse>();
ScholarLevelDetails = new Collection<ScholarLevelDetail>();
Relatives = new Collection<Relative>();
}
public long ClientID { get; set; }
public virtual ICollection<ScholarLevelDetail> ScholarLevelDetails { get; set; }
public virtual ICollection<JobsExperience> JobsExperiences { get; set; }
}
现在我创建了一个客户端服务类,我在其中放置了从数据库获取或向数据库发送数据的所有方法。我有这段代码,它是随机工作的,我会尽力解释清楚。
internal Client GetClient(string userId, bool lazyLoadingEnabled = true)
{
using (var context = new ApplicationDbContext())
{
context.Configuration.LazyLoadingEnabled=lazyLoadingEnabled;
var client = (from _client in context.Client
where _client.ApplicationUserId == userId
select _client).FirstOrDefault();
return client;
}
}
在某些情况下,我的目标是仅检索客户端属性,有时是检索所有属性,包括导航属性。
在我的控制器中我有这样的一行
var client = uuc.GetClient(user.Id, false);
or this
var client = uuc.GetClient(user.Id);
当我运行第一句话时,导航属性已初始化,但所有属性的 Count=0,即使我的数据库有关联的记录也是如此。我认为,如果延迟加载被禁用,则意味着启用了急切加载,但似乎没有。但是,导航属性中没有 Load() 方法来强制加载。
当我运行第二句时,导航属性抛出异常“client.ScholarLevelDetails”引发了“System.ObjectDisposeException”类型的异常。这是在句子后一行抛出的,查看手表中的导航属性。然而,这是最奇怪的部分,如果我回到这句话并调试单步进入该方法,所有导航属性都会正确加载。
为什么立即运行代码的行为与单步执行方法的行为不同?
我假设 using 语句范围在导航属性加载之前完成,但为什么禁用放置加载也无法检索它们?
我如何编码才能具有一致的行为?