2012-06-14 18 views
5

Tengo una tabla de búsqueda y una tabla de datos en mi db. Usaré el género y la persona como ejemplo. Así que digamos que la mesa de género se ve así:Código de Entity Framework Primera carga no lenta después de guardar

Id   Code 
1   Male 
2   Female 

y la mesa persona se ve así:

Id   Name    GenderId 
1   Bob    1 
2   Jane    2 

He modelado ambas tablas en el código EF primera de este modo:

public class Gender 
{ 
    public int Id {get;set;} 
    public string Code {get;set;} 
} 

public class Person 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int GenderId {get;set;} 

    public virtual Gender {get;set;} 
} 

Si leo una persona que ya está en la base de datos, entonces puedo acceder a la persona.Código del género sin ningún problema. Si hago esto:

var person = new Person 
      { 
       Name = "Bob", 
       GenderId = 1, 
      }; 

context.People.Add(person); 
context.SaveChanges(); 

var code = person.Gender.Code; 

Luego se guardará correctamente pero fallará en la última línea ya que el género es nulo. Si luego abro un nuevo contexto y cargo la entidad guardada, la última línea funciona bien. ¿Hay alguna manera de que pueda acceder al género directamente después de guardar como si acabara de cargar la entidad desde el DB?

+0

La última frase está sin terminar, ¿podría corregirlo? –

+0

Lo siento, no se guardó la primera vez y cuando volví a la página no debe haber cargado todo. – VARAK

Respuesta

8

Su problema es que cuando usa new Person() solo creará un objeto POCO que no sabe cómo obtener la propiedad Gender. Para que funcione la carga diferida, necesita proxies.

Usted puede crear su persona como un proxy con DbSet.Create():

var person = context.People.Create(); 
person.Name = "Bob"; 
person.GenderId = 1; 

context.People.Add(person); 
context.SaveChanges(); 
+0

¡Gracias! La primera pieza de código funcionó muy bien. El segundo hubiera sido preferible pero no funcionó. Parece que simplemente escupe la versión en caché de la persona que no tiene habilitada la carga diferida. – VARAK

+0

Sí, parece que 'Find()' no devolverá un proxy ... ¿Puedes probarlo con 'context.People.Single (p => p.Id == person.Id)'? – nemesv

+0

'Single' tampoco funciona. Sin embargo, si llama 'context.People.Load();' antes de 'Find' o' Single', funciona, pero vuelve a cargar la colección en el contexto. Por lo tanto, creo que debería usar 'Create' para generar proxies, así que eliminé la parte relacionada con 'Buscar' de mi respuesta. – nemesv

Cuestiones relacionadas