2012-09-06 28 views
9

Tengo un pequeño problema con la actualización de entidades si la entidad se cambia fuera de DbContext (es una entidad separada). Si adjunto la entidad modificada, su estado no se modifica.¿Cómo actualizar las entidades que se modifican fuera de DbContext?

Mi código es el siguiente:

var specificationToSave = GetSpecificationFromTmpStore(userSessionGuid); 
using (var context = DataContextFactory.GetDataContext()) 
{ 
    // this works for update, if I change the values inside the context while debugging 
    // but it breaks with new entities 
    context.Specifications.Attach(specificationToSave); 

    // this works for insert new entities, modified entities will be saved as new entities 
    context.Specifications.Add((specificationToSave);) 
    context.SaveChanges(); 
} 

sé NHibernate y es el método saveOrUpdate. NHibernate decide por los valores si está actualizando o insertando las entidades.

¿Cuál es la mejor práctica para hacer esto con EF 4.x y con entidades que se modifican fuera del DbContext? ¿Cómo puedo decirle al EF que esta entidad está en estado modificado?

Respuesta

21

También debe decirle a EF que la entidad es modified, después de conectarla.

context.Entry(specificationToSave).State = EntityState.Modified; 

Como alternativa, puede realizar los cambios en la entidad después de que haya que vuelve a unir, por ejemplo, ver MVC3 with EF 4.1 and EntityState.Modified

Editar

Puede utilizar los genéricos con DbSet - ya sea de clase o método - de la siguiente manera:

public void Update<TEntity>(TEntity entity) 
    { 
     DbContext.Set<TEntity>().Attach(entity); 
     DbContext.Entry(entity).State = EntityState.Modified; 
     DbContext.SaveChanges(); 
    } 

Editar: Para la actualización de los padres unifamiliar/Gráficos Niño

Para la actualización de relaciones padre-hijo simples/superficiales donde la eficiencia y el rendimiento no son importantes, simplemente borrando todo el chi antiguo ldren y reinsertar los nuevos es una solución fácil (aunque fea).

Sin embargo, para un escenario más eficiente, es necesario que recorramos el gráfico, detectemos cambios y luego agreguemos elementos recientemente insertados, actualizados, ignorados y eliminados del Context.

Slauma muestra un gran ejemplo of this here.

Es posible que desee consultar el uso de GraphDiff, que puede hacer todo este trabajo de la pierna para usted!

+1

Muchas gracias :-) Eso es lo que estaba buscando. La segunda forma es la mejor, pero en este caso no es posible. Así que tengo que actualizar el estado de DbEntityEntry directamente. No es una solución muy buena, pero funciona. –

+0

Es cierto, si es necesario establecer el estado de cada entidad relacionada de 'specificationToSave'. por ejemplo, si tengo una lista de elementos modificados en mi 'specificationToSave'. Realmente espero que haya una solución simple para hacer eso ... –

+0

@ Jürgen parent: escenarios infantiles necesitan una consideración especial, ya que es posible que deba agregar, eliminar o actualizar los elementos secundarios. FWIW Normalmente solo hago un hash en los niños para ver si alguno ha cambiado, y si lo han hecho, para eliminar todos los existentes e insertar todos los hijos nuevamente. Pero eso solo soy yo perezoso. – StuartLC

Cuestiones relacionadas