2011-10-06 9 views
5

Mam problemy ze zrozumieniem EntityState.Modified, jeśli chodzi o aktualizowanie obiektu .NET MVC3.MVC3 z EF 4.1 i EntityState.Modified on update

Mam model, który przechowuje ImageFilePath i ImageContentType podczas przesyłania obrazu. Oto jak wygląda akcja tworzenia.

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

Problem pojawia się podczas próby edycji, a następnie aktualizacji tego obiektu. To jest moja akcja edycji.

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

Wierzę, że problem wynika z faktu, że ustawiam EntityState.Modified, który oznacza wszystkie właściwości jako zmodyfikowane. Jeśli nie prześlesz nowego obrazu, ImageFilePath i ImageContentType pochodzące z frontonu są efektywnie puste, co właśnie się gromadzi.

Moje pytanie brzmi: jak rozwiązać ten problem? Jaki jest właściwy sposób korzystania z EntityState.Modified?

+0

Czy Twój problem został rozwiązany? Z jakiego rozwiązania korzystałeś? Powiedz mi, Proszę. –

Odpowiedz

0

W swoim zgłoszeniu musisz sprawdzić, czy model jest prawidłowy, a następnie uruchomić procedury CRUD.

if(ModelState.IsValid) 
{ 
    // Save my model 
} 
+0

Nie ma to żadnego efektu. Obiekt zapisuje się dobrze, ale jak już wspomniałem, usuwa właściwości ImageFilePath i ImageContentType, ponieważ nie są one jawnie ustawione i został wywołany EntityState.Modified. –

+0

Czy możesz opublikować definicję klasy SneakPeak? –

3

Zamiast niejawny model wiązania przyjmując SneakPeakCollection w swoich parametrach, można pobrać model z db i używać UpdateModel aby uzyskać nowe wartości, jeśli takie istnieją. Coś takiego:

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
+0

Hej Peretz. Dziękuję Ci. Przeczytałem twój link i udało mi się rozwiązać mój problem, gdy potrzebuję utrzymać wartość CreateOn w Edit post post. To, co zrobiłem, w Edit Post przyniosłem istniejący wiersz i na podstawie tych danych otrzymałem wartość CrerateOn i ustawiłem ją dla obiektu modelu w poście ... czy to prawda? co mówisz? –

+0

@RajanRawal świetnie! –

Powiązane problemy