2

MVC 3アプリケーションでコードファーストでEntity Framework 4.3を使用しています。私はエンティティをそのパラメータとして取得し、データベースを更新するように変更されたエンティティをマークするPOSTアクションを持っています。これは、File Typeへの参照を持つDocumentエンティティです。EF4.3 POSTでのアタッチ後のコードファースト、MVC、レイジーローディング

[HttpPost] 
public ActionResult Example(Document model) 
{ 
    // fileType is null, as expected 
    var fileType = model.FileType; 

    // attach and mark the entity as modified, save changes 
    Context.Entry(model).State = EntityState.Modified; 
    Context.SaveChanges(); 

    // fileType is still null? 
    fileType = model.FileType; 

    return View(model); 
} 

エンティティをコンテキストに添付した後で、そのエンティティのプロパティを遅延ロードできないようにしてください。

興味深いことに、これをコンソールアプリケーションで試してみるとうまくいくようです。

static void Main() 
{ 
    // create a new context 
    var context = new Context(); 

    // get the first document and detach it 
    var doc = context.Documents.First(); 
    context.Entry(doc).State = EntityState.Detached; 

    // fileType is null, as expected 
    var fileType = doc.FileType; 

    // dispose and create a new context 
    context.Dispose(); 
    context = new Context(); 

    // attach the entity and mark it as modified 
    context.Entry(doc).State = EntityState.Modified; 

    // fileType is not null, which is the desired outcome 
    fileType = doc.FileType; 
} 

答えて

6

問題は、それが通常の「新しい」演算子を使用してエンティティFramewortkの外部で作成されたと思われるので、POSTメソッドに渡されたエンティティは、プロキシではないということです。

ここにはいくつかのオプションがあります。まず、DbSet.Createメソッドを使用して、MVCコントローラを変更してプロキシインスタンスを作成することができます。私はこのようにMVCコントローラを変更することは可能だと聞いたことがありますが、自分で試したことはありません。 、代わりにやっての例:

var doc = new Document(); 

をコントローラに、あなたはどうなる:

var doc = context.Documents.Create(); 

作成方法は、企業が適切な仮想の特性を持っている場合EFは、遅延ロードのプロキシを作成することができますどのあなたの場合は、それがそうであるように見えます。

遅延ロードを使用しないで、代わりに明示的ロードAPIを使用することもできます。例えば、のFileTypeロードするために:

var fileType = context.Entry(doc).Reference(d => d.FileType).Load(); 

無理だろ遅延ロードを、これはコンテキストを明示的に参照する必要がありますが、あなたの場合には、それは大丈夫でなければなりません。

+3

ありがとうございます!あなたの説明を使用して、私はプロキシを生成するモデルバインダーを実装するための簡単なソリューションを見つけることができました。ここに私を助けた記事へのリンクがあります。 http://bit.ly/ydCjOm – user326502

+0

@ user326502リンクをありがとう。スーパー便利 –