ASP.NET MVC 2 - «Модель типа 'XYZ' не может быть обновлена" при использовании UpdateModel и LINQ to Entities (.NET 3.5) - PullRequest
8 голосов
/ 21 сентября 2010

У меня есть модель, настроенная с использованием LINQ to Entities, и работающий код, который, как и ожидалось, добавляет в базу данных.Тем не менее, я не могу заставить UpdateModel работать, когда я использую .NET 3.5.

[HttpPost]
public ActionResult Edit(Site.Models.XYZ xyz)
{
    try
    {
        var original = db.XYZ.First(u => u.id == xyz.id);
        UpdateModel(original);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        return View("Error");
    }
}

Это приводит к следующему исключению:

System.InvalidOperationException was caught
  Message=The model of type 'Site.Models.XYZ' could not be updated.
  Source=System.Web.Mvc
  StackTrace:
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix)
       at Site.Controllers.XYZController.Edit(Site.Models.XYZ xyz) in D:***.cs:line 81
  InnerException: 

Если я выполняю UpdateModel(xyz)исключение не возникает, но данные также не сохраняются.

Как заставить UpdateModel работать с этим (без обновления до .NET 4.0), почему его нельзя обновить (исключение не помогает, так какнет внутреннего исключения)?

Ответы [ 4 ]

13 голосов
/ 24 сентября 2010

удалось решить проблему.Это можно сделать одним из двух способов:

TryUpdateModel(original)

или

db.ApplyPropertyChanges(original.EntityKey.EntitySetName, xyz)

Не знаю, почему TryUpdateModel будет работать, а UpdateModel - нет.Может быть, просто ошибка в .NET 3.5.

2 голосов
/ 21 сентября 2010

Что я делаю в своих проектах MVC - это извлеки исходный код DefaultModelBinder из Codeplex и вставьте его в новый класс в своем проекте, например MyDefaultModelBinder. затем зарегистрируйте эту модель в вашем global.asax:

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

это позволяет вам установить точку останова в методе BindModel, и вы можете выяснить, почему он не может связываться.

0 голосов
/ 04 июня 2018

Вы можете этот метод (это работа для меня)

protected internal void UpdateModel<TModel>(TModel model, string[] includeProperties) where TModel : class;

Пример;

string[] includeProperty = { xyz.Id.ToString(),xyz.Name}; UpdateModel(uye, includeProperty);
0 голосов
/ 24 февраля 2017

Используйте TryUpdateModel() вместо UpdateModel() для решения этой функции

Обе функции UpdateModel() и TryUpdateModel() используются для обновления модели со значениями формы и выполнения проверок.

Разница между UpdateModel() & TryUpdateModel()

UpdateModel() выдает исключение в случае сбоя проверки, где как TryUpdateModel() никогда не сгенерирует исключение, возвращает true или false

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