2012-03-04 34 views
12

Tengo una aplicación web MVC que usa SQL Server 2008 como base de datos de back-end junto con Entity Framework. La aplicación funciona bien y extrae datos de la base de datos sin problemas. Mi problema es que cuando hace una actualización de los datos, parece que no los está guardando. Estoy utilizando la función siguiente:Entity Framework no guarda cambios

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 

     context.SaveChanges(); // Breakpoint here 
    } 

Esta función se define en mi código del repositorio. Establecí un punto de interrupción en la línea comentada anteriormente y la aplicación se está rompiendo en la línea, así que sé que está tocando esa línea y los cambios son buenos en el objeto de contexto. No se produce ningún error, EF simplemente no guarda los cambios por algún motivo.

Creo que mi cadena de conexión es correcta, ya que su tirando de los datos muy bien, pero aquí es por si acaso:

<connectionStrings> 
    <add name="EFDbContext" connectionString="Data Source=localhost;Initial Catalog=WarehouseStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

Alguien tiene alguna idea sobre lo que podría causar esto?

+0

suponiendo que se está ejecutando contra el Servidor SQL :-) ¿ha activado el generador de perfiles SQL y ve si EF está enviando cualquier consulta al DB? justo antes de que se realicen cambios de guardado, debe haber una entrada de usuario en el generador de perfiles de EF. –

+0

¿Ha comprobado si está presionando 'context.Products.Add (product);' Si no, no se guarda nada. – veblock

+0

@ Ricky.G - Buena idea, intentaré eso – Icemanind

Respuesta

32

Si usted está después de la funcionalidad de inserción/actualización que tiene que cubrir ambos casos:

if (product.ProductID == 0) 
{ 
    context.Entry(product).State = EntityState.Added; 
} 
else 
{ 
    context.Entry(product).State = EntityState.Modified; 
} 
context.SaveChanges(); 
+0

¡Este cambio solucionó mi problema! ¡Gracias! – Icemanind

+1

¿Hay alguna razón por la que EF no sepa esto sin que se lo digan ... después de todo llamé al método add. Funciona en la edición existente – Chad

+2

Cuando edita la existente, la obtiene de EF primero, de modo que EF rastrea el estado del objeto. Cuando agrega una nueva, crea el objeto fuera de EF, por lo tanto, cuando lo está agregando, debe decirle explícitamente a EF que lo agregue. – veblock

2

se puede utilizar Crear método de contexto: utilizar este método en general, cuando se tiene una entidad relacionada

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      product = context.Products.Create(); 
      product.property = ...; 
      product.property = ...; 

      context.Products.Add(product); 
    } 

    context.SaveChanges(); // Breakpoint here 
} 
3

Gracias a @veblok encontré la solución a mi problema. Hay una opción en la clase DbContext para evitar que EF rastree objetos de forma predeterminada. Una vez eliminado EF, comenzó a comportarse como se esperaba.

public class My Context : DbContext { 
    public MyContext() 
    { 
     // REMOVE this or use veblok's solution 
     this.Configuration.AutoDetectChangesEnabled = false;    
    } 
    ... 
} 
+0

la propiedad 'AutoDetectChangesEnabled' puede mejorar enormemente el rendimiento (y la huella de memoria) para consultas de solo lectura, por lo que si encuentra esto en su base de código, no lo elimine sin verificarlo. Si solo hace una actualización simple dentro de un método que está realizando una lectura compleja, entonces puede querer crear un nuevo contexto de datos para la actualización. –

Cuestiones relacionadas