【问题标题】:Entity Framework 4 eager loading not working at all!Entity Framework 4 急切加载根本不起作用!
【发布时间】:2011-03-03 22:31:45
【问题描述】:

我正在将 linq2sql 转换为实体框架。

在转换过程中,我需要将 linq2sql 的 loadwith 与 include 转换为 eagar 加载,但急切加载不起作用。当我使用分析器时,我发现子实体加载了它们被访问。

DataBaseEntities context = new V3C_DataBaseEntities();

context.Agents.Include("Account");

Agent ag = context.Agents.Where(x => x.Login_ID == "2").SingleOrDefault(); 

// here the account should have been loaded,
// but actually they are loaded with the line below this is executed.

Console.WriteLine(ag.Account.ID.ToString());

如果执行以下操作,它可以完美运行,但我必须按照问题中提到的方式进行。

var c = (from ag in context.Agents.Include("Account")
                     where ag.Login_ID == "2"
                     select ag).SingleOrDefault();

我还想要一种类型安全的加载子实体的方法。

【问题讨论】:

    标签: entity-framework-4 entity


    【解决方案1】:

    你不能像你写的那样做。您必须在查询中使用包含。从 Linq2Sql 转换到 EF 时没有顺畅的方式。您必须接受新的 API 并正确使用它。

    你只能使用这个:

    var query = context.Agents.Include("Account");
    Agent ag = query.Where(x => x.Login_ID == "2").SingleOrDefault(); 
    

    如果你想输入安全的包含版本,你必须下载Entity Framework Feature CTP5 或写你的own extension

    【讨论】:

      【解决方案2】:

      这是您的查询,它不执行急切加载:

      context.Agents.Include("Account");
      
      Agent ag = context.Agents.Where(x => x.Login_ID == "2").SingleOrDefault();
      

      如果您更改查询以将Include 放在表达式中,我相信您会得到您想要的结果。

      Agent ag = context.Agents
                        .Include("Account")
                        .Where(x => x.Login_ID == "2").SingleOrDefault();
      

      在我的测试中,我查看了生成的 SQL,第一个表达式没有加入相关表。您的 Include 将被忽略,因为它不是查询表达式的一部分。

      【讨论】:

      • 嗨,正如我所说,这个工作正常,但我必须采取另一种方式,因为我有一个非常大的方法,并且该方法的数据上下文根据参数加载。底线是,我必须加载问题中定义的数据上下文。
      • 其次,请注意,我想以最流畅的方式从 linq2sql 转换为实体框架。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多