实体框架 - Code First不加载引用的对象

biz*_*zon 6 code-first entity-framework-4 ef-code-first c#-4.0

我有两个由代码生成的简单类.

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; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在数据库中保存公司后,我有公司(Id = 1 | name ="blah"| AddressId = 1)及其地址(Id = 1,Country ="Poland").当我尝试从我的DbContext加载时:

Company company = context.Companies.Find(id);
Run Code Online (Sandbox Code Playgroud)

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

(我正在使用CTP5.)

Bro*_*ass 5

试试这个:

Company company = context.Companies.Include("Address").Find(id);
Run Code Online (Sandbox Code Playgroud)

或使用新的类型语法:

Company company = context.Companies.Include(c => c.Address).Find(id);
Run Code Online (Sandbox Code Playgroud)

这告诉EF急切地将Address实体加载为您Company实体的一部分.

您似乎还在EF上安装了存储库层 - 确保您的存储库实现支持(Include()如果是这种情况).

对于初学者来说,这是Include()Julia Lerman在"编程实体框架"中提供的实现,以支持使用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;
}
Run Code Online (Sandbox Code Playgroud)