我正在尝试在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;
}
}
答案 0 :(得分:3)
还需要将DocumentCategory属性标记为虚拟,以便支持延迟加载。看看http://msdn.microsoft.com/en-us/library/dd468057.aspx
答案 1 :(得分:2)
Document.DocumentCategory是否声明为虚拟? EF要求生成代理类型,在访问属性时实际执行延迟加载。 (否则EF不知道,当您访问该属性的值时)
此外,如果DocumentCategory已经是虚拟的,则可能还有其他属性可以预防EF生成代理类型。使用调试器检查“Document”实例,看它是否实际上是代理类型。