【问题标题】:Lazy Loading in EF6 not populating related list of entities in a POCOEF6 中的延迟加载未填充 POCO 中的相关实体列表
【发布时间】:2015-01-09 13:11:21
【问题描述】:

我们正在对现有数据库使用代码优先方法。 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。 但是当我们尝试显示另一个 Praconicy 实例时,AktualnaKartaRCP 属性返回 null。这是因为 KartyRCP 没有填充数据并且包含 0 个项目,即使它们存在于数据库中。 更奇怪的是,如果我们再次尝试打开同一个实例 Pracownicy,KartyRCP 会被填充。

我们不确定为什么从 POCO 类内部查询时延迟加载不填充相关实体。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,这并不能解决我们的问题,我们之前尝试过。但感谢您的关注。
    • 延迟加载默认开启。
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 2012-12-07
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2015-06-20
    相关资源
    最近更新 更多