EF6 中的延迟加载未填充 POCO 中的相关实体列表
本文关键字:实体 列表 填充 延迟加载 EF6 POCO | 更新日期: 2023-09-27 18:36:59
我们正在对现有数据库使用代码优先方法。ORM是EF6在我们的应用程序中我们也使用PRISM 5.0。使用 RequestNavigate 方法将对象作为参数传递给其他视图模型后出现问题。
我们的目标:
[Table("Pracownicy")]
public partial class Pracownicy
{
///...
public string Name {get; set;}
public virtual ICollection<KartyRCP> KartyRCP { get; set; }
///...
}
[Table("KartyRCP")]
public partial class KartyRCP
{
///...
public string Numer {get; set;}
///...
}
我们在 OnNavigatedTo 方法传递中接收 Pracownicy 的对象。
public void OnNavigatedTo(NavigationContext navigationContext)
{
if (Worker == null && navigationContext.Parameters["pracownik"] != null)
{
Worker = (Pracownicy)navigationContext.Parameters["pracownik"];
if (Worker != null)
{
WorkerPhoto = Worker.Photo;
UpdateWorkAbsencesList();
}
}
}
在此 ViewModel 中,我们引用了 Pracownicy POCO [NotMapped] 属性,该属性查询相关的 KartyRCP 实体(与 KartyRCP (Worker.KartyRCP) 是一对多关系)。
[NotMapped]
public string AktualnaKartaRCP
{
get
{
if (aktualnaKartaRCP == null)
{
aktualnaKartaRCP = this.KartyRCP.Where(z => z.OkresFrom <= DateTime.Today && z.OkresTo >= DateTime.Today).Select(x => x.Numer).FirstOrDefault();
if(aktualnaKartaRCP != null)
aktualnaKartaRCP = aktualnaKartaRCP.TrimStart('0');
}
return aktualnaKartaRCP;
}
}
当我们显示Pracownicy的第一个实例时,结果符合预期 - 选择了KartyRCP之一。但是当我们尝试显示Pracownicy的另一个实例时,AktualnaKartaRCP属性返回null。 这是因为 KartyRCP 没有填充数据并且包含 0 个项目,即使它们存在于数据库中也是如此。更奇怪的是,如果我们尝试再次打开相同的实例Pracownicy,KartyRCP正在被填充。
我们不确定为什么从 POCO 类内部查询时延迟加载不填充相关实体。
我们首先发现了两种解决方法,即从视图模型中请求列表,该模型用数据填充KartyRCP var WorkAroundGetList = Worker.KartyRCP;
。其他解决方法是使用 include 语句包含要热切加载的表: .Include(z => z.KartyRCP)
但我们对这样的解决方案并不满意。提前感谢您的帮助。
在数据库的上下文构造函数上,您需要启用延迟加载,因为它默认处于关闭状态;
public MyDbContext()
: base("MyDbContext")
{
this.Configuration.LazyLoadingEnabled = true;
}