2011-07-05 23 views
1

我試圖啓用惰性加載EF4上下文。延遲加載不適用於我inEntity Framework 4

正試圖加載數據的代碼是:

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

Do * all *文檔有一個DocumentCategory?只是想知道LazyLoading確實嘗試爲給定的Document檢索DocumentCategory並且沒有找到,因此返回null並導致您的NullReferenceException。 – Smudge202

+0

是的,DocumentCategoryId是數據庫中的一個不可爲空的字段,表之間存在一個外鍵。 –

+1

導航屬性是否標記爲虛擬?你能告訴我們你的文檔類的定義嗎? – Dave

回答

2

是Document.DocumentCategory聲明爲虛? EF需要這個來生成一個代理類型,當你訪問該屬性時,它實際上會執行延遲加載。 (否則EF不知道,當你訪問屬性的值時)

此外,如果DocumentCategory已經是虛擬的,可能有其他屬性預先生成一個代理類型的EF。用調試器檢查一個「Document」實例,看看它是否實際是一個代理類型。