Может ли System.Web.MVC.UpdateModel обновить свойства навигации EF? - PullRequest
4 голосов
/ 20 мая 2009

Если в моей базе данных есть 2 таблицы: Foo и bar . Foo идентифицируется FooId , а Bar идентифицируется BarId . A Bar может иметь от 0 до многих Foos , поэтому Foo имеет BarId в качестве внешнего ключа.

У меня есть модель, которая представляет это, и представление, которое можно использовать для редактирования Foo и выбора (из раскрывающегося списка) соответствующего Bar .

Учитывая следующий метод на контроллере:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formCollection)
{
    Foo originalFoo = FooById(id);

    if (!ModelState.IsValid)
    {
        return View(new VenueViewModel(originalVenue, _db.GetCounties(), _db.VenueTypeSet));
    }

    UpdateModel(originalFoo);

    /* Instead of using UpdateModel I could just iterate through 
       formCollection and manually update originalFoo, it would 
       work but surely there is a better way? */

    _db.SaveChanges();

    return RedirectToAction("Index");
}

При вызове UpdateModel выдается InvalidOperationException без InnerException :

The model of type 'TestApplication.Models.Foo' was not successfully updated.

Какой правильный способ для моего контроллера обновить мою модель на основе Entity Framework из выпадающего списка?

1 Ответ

7 голосов
/ 20 мая 2009

Нет, механизм связывания модели по умолчанию не сможет этого сделать. Вам также будет сложно написать пользовательское связующее для моделей. Элемент HTML SELECT будет хранить только значение идентификатора в описании, которого недостаточно для материализации большинства экземпляров сущности. Таким образом, мы просто имеем дело с тем фактом, что мы будем получать только идентификатор, которого недостаточно для материализации сущности без попадания в базу данных.

Поэтому при обновлении свойств навигации объекта у нас есть два варианта:

  1. Считать объект из базы данных и назначить его свойству навигации в контроллере.
  2. Не пытайтесь материализовать сущность для свойства навигации; вместо этого просто назначьте EntityKey .

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

Новая версия Entity Framework в предстоящем .NET 4.0 будет иметь новую функцию под названием «Ассоциации FK», которая значительно облегчит эту задачу.

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