实体框架4相关实体未加载

时间:2016-06-09 19:12:37

标签: c# entity-framework entity-framework-4

我在EF4中使用查询根据其中的数据通过各种其他方式(而不是EF)撤回记录和处理信息,因此我经常在列表中分离EF对象。

在这种情况下,我在EntityFramework 4.0中有一个未加载相关实体的查询,即使我使用.Include(" ...")方法。

using (MyDBEntities ctx = new MyDBEntities())
{
    ctx.ContextOptions.LazyLoadingEnabled = false;

    // Get the first X records that need to be processed
    var q = (from t in ctx.DBTables
                .Include("Customer")
             let c = t.Customer
             where t.statusID == (int)Enums.Status.PostProcessing
             && c.isActive == true
             select t
            ).Take(batchSize).ToList();

    foreach (DBTable t in q)
    {
        // this results in c == null
        Customer c = t.Customer;

        // However t.CustomerID has a value, thus I know 
        // that t links to a real Customer record
        Console.WriteLine(t.CustomerID);
    }
}

任何人都可以帮助我理解为什么客户没有加载,即使我明确表示要包含它?

1 个答案:

答案 0 :(得分:0)

我找到了问题的根源!恶魔在于"让"命令。无论什么时候我有一个或者第二个来自"子句(如连接),然后"。包括"被忽略!!!

// -- THIS FAILS TO RETRIEVE CUSTOMER
// Get the first X records that need to be processed
var q = (from t in ctx.DBTables
            .Include("Customer")
         // Using a "let" like this or 
         let c = t.Customer
         // a "from" like this immediately causes my include to be ignored.
         from ca in c.CustomerAddresses
         where t.statusID == (int)Enums.Status.PostProcessing
         && c.isActive == true
         && ca.ValidAddress == true
         select t
        ).Take(batchSize).ToList();

但是,我可以在一次通话中获取我需要提取的ID,然后再获得第二个" go get my includes"打电话,一切正常。

// Get the first X record IDs that need to be processed
var q = (from t in ctx.DBTables
         let c = t.Customer
         from ca in c.CustomerAddresses
         where t.statusID == (int)Enums.Status.PostProcessing
         && c.isActive == true
         && ca.ValidAddress == true
         select t.TableID
        ).Take(batchSize).ToList();

// Now... go "deep-load" the records I need by ID
var ret = (from t in ctx.DBTables
            .Include("Customer")
           where q.Contains(t.TableID)
           select t);