8

En ASP .NET MVC 3 con Entity Framework, tengo un objeto de dominio que tiene una propiedad de navegación referencia a otros objetos, de la siguiente manera:Cómo actualizar las propiedades de navegación de la entidad en el marco de la entidad

public class Person 
{ 
    public String Name {get;set;} 

    public Guid CompanyID{get;set;} 

    [ForeignKey(CompanyID)] 
    public virtual CompanyType Company{ get; set; } 
} 

Cuando creo una instancia de Person e intenta agregarlo a la base de datos, DBContext mantiene un caché de esta entidad 'Persona' y lo envía a la base de datos. De modo que más adelante en la vida de la misma instancia de contexto, cuando intento acceder a esta entidad, el campo Empresa siempre es nulo ya que la propiedad de navegación nunca se actualizó.

¿Hay alguna manera de actualizar la propiedad de navegación con lo que existe en la base de datos?

La carga diferida está activada.

Respuesta

11

Si la carga diferida se enciende y se desea cargar la propiedad de navegación con carga diferida debe crear un proxy de un nuevo Person, no instanciarlo con new, así:

using (var context = new MyDbContext()) 
{ 
    var person = context.People.Create(); // creates a lazy loading proxy 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    var company = person.Company; // lazy loading query happens here 
} 

Sin carga diferida puede usar la carga explícita:

using (var context = new MyDbContext()) 
{ 
    var person = new Person(); 
    person.CompanyID = 123; 
    context.People.Add(person); 
    context.SaveChanges(); 

    context.Entry(person).Reference(p => p.Company).Load(); // explicit loading 

    var company = person.Company; // no query anymore, Company is already loaded 
} 
+0

Esto requiere que el programa recargue explícitamente cada propiedad de navegación que exista. ¿Hay alguna manera de implementar algo más básico, para volver a cargar todas las propiedades de navegación para cualquier entrada de entidad? Intenté la función Recargar para DbEntityEntry, pero parece que no funciona. – daniely

+0

@daniely: No, eso no es posible. La única forma con una sola transferencia de datos base sería usar la carga ansiosa con múltiples 'Incluir' para cargar todas las propiedades de navegación. Pero esto también cargaría la entidad padre y usted tiene que escribir 'Include's para todas las propiedades de navegación manualmente. – Slauma

+0

@Slauma Al usar context.People.Include (p => p.NavProp1) .Include (p => p.NavProp2) Puedo cargar en cadena varias propiedades de navegación creando un solo hit para la base de datos. ¿Hay alguna manera similar de cargar varias propiedades de navegación con context.Entry (person) .Reference (...)? No puedo encontrar una forma de especificar todas las propiedades de navegación, así que solo puedo llamar a Load() una vez. –

Cuestiones relacionadas