EF4.3 Code-First, MVC, отложенная загрузка после присоединения в действии POST - PullRequest
2 голосов
/ 14 марта 2012

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

 [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;
}

1 Ответ

7 голосов
/ 14 марта 2012

Проблема в том, что сущность, переданная методу post, не является прокси, предположительно потому, что она была создана за пределами Entity Framewortk с использованием обычного оператора "new".

Здесь есть несколько вариантов.Во-первых, вы можете изменить контроллер MVC для создания экземпляров прокси, используя метод DbSet.Create.Я слышал, что таким способом можно изменить контроллер MVC, но сам никогда не пробовал.Например, вместо того, чтобы делать:

var doc = new Document();

в контроллере, вы должны сделать:

var doc = context.Documents.Create();

Метод create позволяет EF создать прокси для отложенной загрузки, если объект имеет соответствующуювиртуальные свойства, что в вашем случае выглядит так.

Второй и потенциально более простой вариант - не использовать отложенную загрузку, а вместо этого использовать явные API загрузки.Например, чтобы загрузить FileType:

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

Вряд ли ленивая загрузка требует явной ссылки на контекст, но в вашем случае это должно быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...