2011-03-22 71 views
6

我有两个简单的类首先由代码生成。实体框架 - 代码优先不加载引用的对象

public class Company 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Country { get; set; } 
    ... 
} 

在数据库中保存公司后,我有公司(ID = 1 |名= “嗒嗒” | AddressId = 1)和它的地址(ID = 1,国家= “波兰”)。当我试图从我的DbContext加载:

Company company = context.Companies.Find(id); 

我得到公司与空地址属性。我究竟做错了什么?

(我使用CTP5)

+0

顺便说一句。不使用CTP5已经有EF 4.1 RC,它有API的“最终”版本:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2dc5ddac-5a96-48b2-878d-b9f49d87569a – 2011-03-22 08:48:11

+0

你是如何访问“地址”的。应该有延迟加载触发。 – 2011-03-22 08:49:43

+0

我检查了我的版本。我有EntityFramework.dll运行版本v4.0.30319和版本4.0.0.0。当我使用nuget时,我得到' PM> Install-Package EntityFramework 'EntityFramework 4.1.10311.0'已经安装。 I-mo已经有了'EntityFramework 4.1.10311.0'的引用。'' 这是奇怪的,懒惰的负载仍然无法正常工作。 – bizon 2011-03-22 09:44:46

回答

5

试试这个:

Company company = context.Companies.Include("Address").Find(id); 

或新类型化的语法:

Company company = context.Companies.Include(c => c.Address).Find(id); 

这告诉EF热切加载Address实体你的Company实体的一部分。

它似乎还有EF上的存储库层 - 确保您的存储库实现支持Include()如果是这种情况。

只是个开始这是Include()朱莉娅·勒曼提供了“编程实体框架”支持单位可测试库模式与POCOS(此版本只适用于第一种语法)实现:

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path) 
{ 
    var objectQuery = source as ObjectQuery<TSource>; 
    if (objectQuery != null) 
    { 
     return objectQuery.Include(path); 
    } 
    return source; 
} 
+1

或者你可以使用更通用的自定义扩展包括:http://stackoverflow.com/questions/5376421/ef-including-other-entities-generic-repository-pattern/5376637#5376637 – 2011-03-22 08:50:28