2012-04-30 19 views
27

Dado el siguiente código, ¿cómo EF/DbContext sabe sobre el cambio realizado en el cliente objeto:Cómo cambiar el seguimiento de los trabajos en Entity Framework

class Program 
{ 
    static void Main() 
    { 
     using(var shopContext = new ShopContext()) 
     { 
      var customer = shopContext.Customers.Find(7); 

      customer.City = "Marion"; 

      customer.State = "Indiana"; 

      shopContext.SaveChanges(); 
     } 
    } 
} 

public class ShopContext : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

Gracias

+3

Para los cargadores nuevos, esta publicación del blog podría ser útil: http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

Respuesta

45

Cuando se carga la entidad desde el contexto mantiene una estructura de datos adicional, vamos a llamarlo entrada. La entrada contiene dos conjuntos de valores: valores originales y valores actuales. Cuando ejecuta la operación SaveChanges, EF pasa por las entidades de sus clientes y actualiza los valores actuales en la entrada para que coincidan con el estado real de su entidad: esta operación se llama y detecta los cambios. Durante la generación del comando SQL, EF comparará los valores actuales y los originales y creará una declaración de actualización SQL para modificar los valores modificados en la base de datos. Esta operación se llama snapshot change tracking - EF mantiene una instantánea en la entrada.

Hay una alternativa llamada seguimiento de cambio dinámico que modificará el valor actual en la entrada al mismo tiempo que asigna el valor a la propiedad de su entidad. El seguimiento de cambios dinámicos tiene requisitos específicos (como todas sus propiedades en la entidad debe ser virtual) porque debe ajustar su clase a un proxy dinámico en tiempo de ejecución. Esta solía ser la forma preferida, pero debido a algunos problemas de rendimiento en escenarios complejos, actualmente se supone que el seguimiento de cambios de instantáneas se usa como predeterminado.

+0

hi , ¿cómo sabe el contexto sobre el objeto del cliente? ¿Cómo se conecta/vincula? –

+0

El contexto lo conoce porque recuperó el objeto del cliente a través de la misma instancia de contexto al llamar a 'Customers.Find' –

+0

esta es una referencia? –

Cuestiones relacionadas