2011-03-02 80 views
0

我正在将linq2sql转换为实体框架。实体框架4急切加载根本不工作!

在转换过程中,我需要将包含eagar加载的linq2sql的加载转换为转换,但是加载不成功。当我使用分析器时,我发现子实体被加载并被访问。

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(); 

我还想加载子实体类型安全的方式。

回答

0

这是您的查询不执行急于负载:

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被忽略,因为它不是查询表达式的一部分。

+0

嗨,正如我所说这一个工作正常,但我必须做另一种方式,因为我有一个非常大的方法,并根据参数加载该方法的datacontext。底线是,我必须加载问题中定义的datacontext。 – 2011-03-02 23:13:07

+0

其次,请注意,我想以最顺利的方式将linq2sql转换为实体框架。 – 2011-03-02 23:39:08

4

你不能这样做,因为你写的问题。您必须在查询中使用包含。从Linq2Sql转换到EF时没有平滑的方式。您必须接受新的API并正确使用它。如果你想输入的安全包括版本,则必须下载Entity Framework Feature CTP5或写你的own extension

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

只能使用此。