2011-10-06 19 views
5

Tengo problemas para entender EntityState.Modified cuando se trata de actualizar un objeto con .NET MVC3.MVC3 con EF 4.1 y EntityState. Modificado en la actualización

Tengo un modelo que almacena un ImageFilePath y ImageContentType cuando se carga una imagen. Aquí es cómo se ve la acción de crear.

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

El problema se produce al intentar editar y posteriormente actualizar este objeto. Esta es mi acción Editar.

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

creo que el problema viene del hecho de que estoy estableciendo EntityState.Modified que marca todas las propiedades en su forma modificada. Si no carga una nueva imagen, ImageFilePath y ImageContentType procedentes del front-end son efectivamente nulas, que es lo que se está almacenando.

Mi pregunta es ¿cómo puedo resolver esto? ¿Cuál es la forma correcta de usar EntityState.Modified?

+0

se resuelve su problema? ¿Qué solución usaste? Por favor dime. –

Respuesta

0

En su envío debe verificar si el modelo es válido y luego ejecutar sus rutinas CRUD.

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

Esto no tiene ningún efecto. El objeto se guarda bien, pero como mencioné, borra las propiedades ImageFilePath e ImageContentType porque no están explícitamente establecidas y se ha llamado a EntityState.Modified. –

+0

¿Puede publicar su definición de clase de SneakPeak? –

3

En lugar de utilizar modelo implícito de unión al aceptar un SneakPeakCollection en sus parámetros, se ha podido recuperar el modelo a partir de la base de datos y utilizar UpdateModel para obtener los nuevos valores si es que existen. Algo como esto:

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

Hola Peretz. Gracias. Leí su enlace y pude resolver mi problema donde necesito mantener el valor CreatedOn en la publicación Editar formulario. Lo que hice fue, en Editar publicación, obtener una fila existente y, a partir de esos datos, obtuve el valor CreratedOn y lo configuré para Objeto modelo en la publicación ... ¿es correcto? ¿Que dices? –

+0

@RajanRawal ¡Genial! –

Cuestiones relacionadas