EF6中的延迟加载未填充POCO中的相关实体列表

时间:2015-01-09 13:11:22

标签: c# entity-framework linq-to-entities lazy-loading prism-5

我们正在使用代码第一种方法来处理现有数据库。 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类内部查询时,延迟加载不会填充相关实体。

我们首先发现两个解决方法是从视图模型中请求列表,该模型使用数据var WorkAroundGetList = Worker.KartyRCP;填充KartyRCP。其他解决方法是使用include语句包含要急切加载Pracownicy的表:.Include(z => z.KartyRCP)

但我们对此类解决方案并不满意。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在数据库的上下文构造函数中,您需要在默认情况下关闭时启用延迟加载;

    public MyDbContext()
        : base("MyDbContext")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }