2

Я использую Entity Framework 4.3 с Code-First в приложении MVC 3. У меня есть действие POST, которое получает объект как его параметр, а затем помещает объект как измененный для обновления базы данных. Это объект Document, который имеет ссылку на тип файла.EF4.3 Code-First, MVC, Lazy Загрузка после присоединения в POST-действии

[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

Проблема заключается в том, что объект передается методу пост не является прокси, предположительно потому, что она была создана за пределами Entity Framewortk, используя обычный «новый» оператор.

Здесь есть несколько вариантов. Во-первых, вы можете изменить контроллер MVC для создания экземпляров прокси с помощью метода DbSet.Create. Я слышал, что можно изменить контроллер 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 спасибо за ссылку. Супер полезный –