在我的Entity Framework项目中,延迟加载被禁用,并希望默认情况下禁用它。
到目前为止,我已经习惯了加载外键值,以防需要使用Include()方法进行进一步处理。
但是,每当我将一个持有加载的外键对象的对象放入另一个对象时,从外部对象的角度看,外键似乎为空。
var teams = (from team in db.Teams.Include("Captain")
orderby team.Name
select new ExtendedTeam {
Team = team
}).AsEnumerable();
// teams.First().Customer.Captain is null though the Captain property was explictly included
如何在不禁用延迟加载的情况下访问Captain属性?我不希望将Captain属性添加到Extended Team类。
答案 0 :(得分:1)
您的预测似乎搞砸了Include。
我不确定“客户”变量的来源,但如果您需要进行类似的投影,则可以执行以下操作:
var teams = (from team in db.Teams
orderby team.Name
select new {
Team = team,
Captain = team.Captain,
}).ToList(); // execute the query
这将为您提供匿名类型的客户和船长。您可以从中提取数据以填充ExtendedTeam对象。
因为我在查询上调用了ToList(),所以我执行了查询,而我的匿名对象有Team对象和Captain对象。作为其副作用,实体框架也对关系进行了“修复”。如果您检查匿名类型的Team属性,您会注意到Captain也填充了它。 EF非常聪明,知道它们是相关的,它确实在Team对象上建立了关系。您现在可以像这样处理结果:
var extended = teams.Select(t => new ExtendedTeam { Team = t });
这应该有效。