2011-08-18 16 views
16

Uso primero el código de Entity Framework 4.1. ¿Existe una forma incorporada de obtener una lista de las propiedades que han cambiado desde que la entidad se cargó desde la base de datos? Sé que el código primero detecta que un objeto fue cambiado, pero ¿hay alguna forma de obtener exactamente qué propiedades han cambiado?EF 4.1 Primero el código: determinar qué propiedades han cambiado

Respuesta

28

Para las propiedades escalares y complejos que puede utilizar lo siguiente para extraer los nombres de las propiedades cambiadas de una entidad myEntity:

var entry = context.Entry(myEntity); 
var namesOfChangedProperties = entry.CurrentValues.PropertyNames 
    .Where(p => entry.Property(p).IsModified); 

Algunas cosas a destacar aquí:

  • CurrentValues.PropertyNames solamente contiene escalar y propiedades complejas, no propiedades de navegación.

  • propiedades complejas significa: Sólo el nombre del complejo de la propiedad que se declara en la entidad, no las propiedades individuales reales del mismo tipo complejo, por ejemplo: Si usted tiene este modelo ...

    [ComplexType] 
    public class Address 
    { 
        public string Country { get; set; } 
        public string City { get; set; } 
    } 
    
    public class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public Address Address { get; set; } 
    } 
    

    ... entonces, si myEntity es una Person, CurrentValues.PropertyNames contendría "Id", "Nombre " y "Dirección ", pero no "Address.Country" o "Address.City "(ni" País "o" Ciudad ").

  • Si una propiedad complejo está marcado como modificado (.IsModified en el código anterior es true) entonces esto significa que, o bien la referencia (Person.Address en el ejemplo anterior) ha cambiado, no importa si en realidad los valores de propiedad (Country y City) dentro del tipo complejo han cambiado o no. O que cualquiera de las propiedades del tipo complejo ha cambiado (Country o City ha cambiado). Creo que no es posible averiguar cuál, porque EF siempre envía un comando UPDATE para todas las propiedades de tipo complejo a la base de datos, incluso si solo una propiedad ha cambiado y la otra permaneció sin cambios. De esto concluiría que EF no realiza un seguimiento de los cambios de las propiedades de tipos complejos individuales.

+2

¡genial, también funciona para mí con Entity framework 6! –

Cuestiones relacionadas