2012-03-22 21 views
16

estoy trabajando en un proyecto de MVC, con el patrón de repositorio y marco de la entidad, ahora en mi forma tengo un modelo de ejemploactualización de ADO.NET Entity Framework modelo parcial

SampleModel
1) Nombre
2)
edad 3) Dirección
4) señala
5) fecha de actualización

estoy mostrando únicamente siguientes datos en el formulario de edición
1) nombre
2)
edad 3) abordan

ahora si actualizar el modelo al que le faltan los valores de propiedad utilizando el repositorio, las notas, campo dateupdated va nula.

Mi pregunta es cómo puedo actualizar solo algunas propiedades seleccionadas usando el repositorio (tryupdatemodel no está disponible en el repositorio) y no quiero llamar al objeto original y asignar las propiedades con el modelo actualizado.

¿Hay alguna manera, debe haber.

Respuesta

21

Puede actualizar solamente subconjunto de campos:

using (var context = new YourDbContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel); 
    entry.Property(e => e.Name).IsModified = true; 
    entry.Property(e => e.Age).IsModified = true; 
    entry.Property(e => e.Address).IsModified = true; 

    context.SaveChanges(); 
} 

o en la API ObjectContext:

using (var context = new YourObjectContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel); 
    entry.SetModifiedProperty("Name"); 
    entry.SetModifiedProperty("Age"); 
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges(); 
} 
+0

ohh ok o escribir consultas SQL para actualizar, ¿verdad? o escriba un ayudante genérico para marcar las propiedades editadas, humm ... eso es lo que TryUpdate debe hacer. – Milan

+0

La entrada() no existe en EF 4.0. – Suncat2000

+1

@ Suncat2000: El segundo ejemplo es para EF 4.0, el primero es para EF 4.1 y posteriores. –

1

Se trata de un viejo hilo, pero si alguien está interesado, que se extienden en las soluciones de Ladislav, nos He venido con un método de extensión útil para EF 4.1 y más reciente:

public static void SetModified<TEntity>(
     this DbEntityEntry<TEntity> entry, 
     IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity 
    { 
     foreach (var expression in expressions) 
      entry.Property(expression).IsModified = true; 
    } 

Obviamente y Deberá eliminar la restricción IEntity a menos que esté utilizando una interfaz con el mismo nombre para sus POCO.

Ejemplo de uso sería:

 var user = new User 
     { 
      Id = Request.Id, 
      UserName = Request.UserName, 
      FirstName = Request.FirstName 
     }; 

     var expressions = new List<Expression<Func<User, object>>> 
       { 
        x => x.UserName, 
        x => x.FirstName 
       }; 

     context.Entry(user).SetModified(expressions); 
Cuestiones relacionadas