延迟加载在Entity Framework 4中对我不起作用

时间:2011-07-05 09:30:18

标签: c# .net sql-server entity-framework

我正在尝试在EF4上下文中启用延迟加载。

尝试加载数据的代码是:

using (IUnitOfWork uw = new EFUnitOfWork())
{
    foreach (Document doc in uw.Documents.All)
    {        
        Console.WriteLine("Name: {0} Description: {1} Category: {2}", doc.Name, doc.Description, doc.DocumentCategory.Name);
    }
}

我正在尝试使用存储库和工作单元模式,但据我所知,下面的命令应该有效。

ctx.ContextOptions.LazyLoadingEnabled = true;

我遇到的问题是访问doc.DocumentCategory.Name时,我得到一个NullReferenceException。

为什么懒散地加载这些数据?

如果我加载了DocumentCategories,则会解析DocumentCategory属性。

我的文档类定义如下:

public class Document
{
    public Document()
    {

    }

    public Document(int id)
    {
        Id = id;
    }

    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual int DocumentCategoryId { get; set; }
    public virtual bool Deleted { get; set; }
    public DocumentCategory DocumentCategory { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

2 个答案:

答案 0 :(得分:3)

还需要将DocumentCategory属性标记为虚拟,以便支持延迟加载。看看http://msdn.microsoft.com/en-us/library/dd468057.aspx

答案 1 :(得分:2)

Document.DocumentCategory是否声明为虚拟? EF要求生成代理类型,在访问属性时实际执行延迟加载。 (否则EF不知道,当您访问该属性的值时)

此外,如果DocumentCategory已经是虚拟的,则可能还有其他属性可以预防EF生成代理类型。使用调试器检查“Document”实例,看它是否实际上是代理类型。

相关问题