MVC3 с EF 4.1 и EntityState.Modified при обновлении - PullRequest
5 голосов
/ 06 октября 2011

У меня проблемы с пониманием EntityState.Modified, когда дело доходит до обновления объекта с помощью .NET MVC3.

У меня есть модель, которая хранит ImageFilePath и ImageContentType при загрузке изображения.Вот как выглядит действие создания.

    [HttpPost]
    public ActionResult Create(SneakPeekCollection collection, HttpPostedFileBase image)
    {
        try
        {
            if (image != null)
            {
                var filepath = Path.Combine(HttpContext.Server.MapPath("../../Uploads"), Path.GetFileName(image.FileName));
                image.SaveAs(filepath);
                collection.ImageContentType = image.ContentType;
                collection.ImageFilePath = "~/Uploads/" + image.FileName;

            }
            _db.SneakPeekCollections.Add(collection);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Проблема возникает при попытке отредактировать и впоследствии обновить этот объект.Это моё действие редактирования.

    [HttpPost]
    public ActionResult Edit(int id, SneakPeekCollection collection, HttpPostedFileBase image)
    {
        try
        {
            if (image != null)
            {
                var filepath = Path.Combine(HttpContext.Server.MapPath("../../../Uploads"), Path.GetFileName(image.FileName));
                image.SaveAs(filepath);
                collection.ImageContentType = image.ContentType;
                collection.ImageFilePath = "~/Uploads/" + image.FileName;
            }
            _db.Entry(collection).State = EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Я считаю, что проблема связана с тем, что я устанавливаю EntityState.Modified, который помечает все свойства как измененные.Если я не загружаю новое изображение, ImageFilePath и ImageContentType, поступающие из внешнего интерфейса, фактически равны нулю, что и хранится.

Мой вопрос, как мне решить эту проблему?Как правильно использовать EntityState.Modified?

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Вместо использования неявного связывания модели путем принятия SneakPeakCollection в ваших параметрах, вы можете извлечь модель из БД и использовать UpdateModel, чтобы получить новые значения, если они существуют. Примерно так:

var collection = _db.SneakPeaks.Find(id); // Get the entity to update from the db
UpdateModel(collection); // Explicitly invoke model binding
if (image != null)
{
                var filepath = Path.Combine(HttpContext.Server.MapPath("../../../Uploads"), Path.GetFileName(image.FileName));
                image.SaveAs(filepath);
                collection.ImageContentType = image.ContentType;
                collection.ImageFilePath = "~/Uploads/" + image.FileName;
}
_db.SaveChanges();
0 голосов
/ 01 декабря 2011
0 голосов
/ 06 октября 2011

При отправке вам необходимо проверить, является ли модель действительной, а затем запустить процедуры CRUD.

if(ModelState.IsValid)
{
   // Save my model
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...