2011-07-05 11 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を取得しようとしたためにnoneが見つかった場合は、nullを返してNullReferenceExceptionを引き起こします。 – Smudge202

+0

はい、DocumentCategoryIdはデータベース内のnull不可能なフィールドであり、テーブル間に外部キーが存在します。 –

+1

ナビゲーションプロパティは仮想としてマークされていますか? Documentクラスの定義を教えてください。 – Dave

答えて

3

遅延ローディングをサポートするには、DocumentCategoryプロパティも仮想としてマークする必要があります。ご覧くださいhttp://msdn.microsoft.com/en-us/library/dd468057.aspx

+0

ありがとうございました。なぜなら、あなたは質問のコメントに最初にそこにいたからです。 –

+0

いい気持ちはありません:) –

2

Document.DocumentCategoryは、仮想として宣言されていますか? EFでは、プロパティにアクセスするときに実際に遅延ロードを実行するプロキシタイプを生成するためにこれが必要です。 (そうでなければ、プロパティの値にアクセスするとEFはわかりません)

また、DocumentCategoryがすでに仮想である場合、EFがプロキシタイプを生成する前に他のプロパティが存在する可能性があります。デバッガで "Document"インスタンスを調べて、実際にプロキシ型であるかどうかを確認します。

関連する問題