实体框架:创建新对象后,显式加载的外键属性为null

时间:2014-02-28 13:11:04

标签: asp.net-mvc entity-framework entity-framework-4 lazy-loading

在我的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类。

1 个答案:

答案 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 });

这应该有效。