5

Tengo un código MVC que serializa un objeto EF 3.5 en un tipo anónimo para devolver como resultado JSON a una llamada AJAX en mi página. El obstáculo que tengo es que cuando envío el objeto al servidor a través de JSON, (y deje que el ModelBinder lo deserialice en mi tipo de EF), tengo que actualizarlo en el contexto de Entity Framework manualmente. O al menos eso es lo que estoy haciendo ahora. No tiene EntityKey, por lo que adjuntarlo falla. Termino teniendo que buscar el objeto viejo y actualizarlo propiedad por propiedad. Alguna idea sobre esto? ¿La solución es pasar la EntityKey con mi objeto?La mejor manera de transferir un objeto Entity Framework a través de la web y de vuelta a través de JSON

Esto es lo que tengo:

public void Update(Album album) 
    { 
     using (var db = new BandSitesMasterEntities()) 
     { 
      var albumToUpdate = db.Album.First(x => x.ID == album.ID); 

      albumToUpdate.AlbumTitle = album.AlbumTitle; 
      albumToUpdate.Description = album.Description; 
      albumToUpdate.ReleaseYear = album.ReleaseYear; 
      albumToUpdate.ImageURL = album.ImageURL; 
      albumToUpdate.OtherURL = album.OtherURL; 

      db.SaveChanges(); 
     } 
    } 

Y esto es lo que me gustaría hacer, o algo similar:

public void Update(Album album) 
    { 
     using (var db = new BandSitesMasterEntities()) 
     { 
      db.Attach(album) 
      db.SaveChanges(); 
     } 
    } 
+0

está usando EF 4? – ashraf

+0

¿por qué no utiliza los servicios de datos? – Nix

+0

@ashraf, él dice que está usando EF 3.5 – StriplingWarrior

Respuesta

0

¿Usted intentó algo como:

object original; 
var key = contexte..CreateEntityKey("EntitySet", modified); 
if(contexte.TryGetObjectByKey(key, out original)) 
{ 
    var originalEntity = (YourEntityType)original; 
    // You have to mannualy set your entityKey 
    originalEntity.YourEntityReference.EntityKey = new EntityKey("Entities.EntitySet", "Id", modified.YourEntity.Id); 

    contexte.ApplyPropertyChanges("EntitySet", modified); 
} 
contexte.SaveChanges(); 

Suponiendo que su EntityReference son establecidos por desplegable, usted todavía tiene el Id

1

o se puede utilizar para mapear los AutoMapper campos para usted, por lo que solo agregaría una línea adicional a su ejemplo.

+0

2 líneas en realidad - recupera la clave y luego mapea. –

1

¿Por qué no utilizar simplemente los métodos del controlador UpdateModel o TryUpdateModel? Funciona muy bien con EF e incluso puede establecer explícitamente la lista de propiedades incluidas.

El parámetro id se correlacionará automáticamente a través del marco MVC con el campo oculto en su formulario que especifica la identificación.

public void Update(int id, FormCollection collection) 
{ 
    using (var db = new BandSitesMasterEntities()) 
    { 
     var albumToUpdate = db.Album.First(x => x.ID == id); 

     //use UpdateModel to update object, or even TryUpdateModel 
     UpdateModel(albumToUpdate, new string[] { "AlbumTitle", "Description", "ReleaseYear", "ImageURL", "OtherURL" }); 

     db.SaveChanges(); 
    } 
} 
1

Esto se hizo mucho más fácil para nosotros en EF 4.0. Esto es lo que hicimos en EF 3.5:

public static void AttachAsModified(this ObjectContext objectContext, string setName, object entity, 
            IEnumerable<String> modifiedFields) 
{ 
    objectContext.AttachTo(setName, entity); 
    ObjectStateEntry stateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(entity); 
    foreach (String field in modifiedFields) 
    { 
     stateEntry.SetModifiedProperty(field); 
    } 
} 

Y luego:

using (var db = new BandSitesMasterEntities()) 
{ 
    db.AttachAsModified("Album", album, new string[] { "AlbumTitle", "Description", "ReleaseYear", "ImageURL", "OtherURL" }) 
    db.SaveChanges(); 
} 

se vuelve más complicado si usted tiene restricciones de clave externa, pero parece que no lo hace.

0

En clase parcial de su entidad álbum puede definir una función CopyFrom y llamarlo desde su función de actualización

partial class Album 
{ 
    public void CopyFrom(Album album) 
    { 
    //individual field copying here 
    } 
} 


public void Update(Album album) 
    { 
     ... 
     albumToUpdate.CopyFrom(album); 
     ... 
    } 
Cuestiones relacionadas