2011-03-22 19 views
6

Tengo dos clases simples generadas por código primero.Entity Framework - Code First no carga el objeto referenciado

public class Company 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Country { get; set; } 
    ... 
} 

Después de guardar la base de datos de la empresa en la que tengo Company (Id = 1 | name = "bla" | AddressID = 1) y su Dirección (Id = 1, País = "Polonia"). Cuando intento cargar desde mi DbContext:

Company company = context.Companies.Find(id); 

Obtengo una empresa con propiedad de dirección nula. ¿Qué estoy haciendo mal?

(. Estoy usando CTP5)

+0

Por cierto. no use CTP5 ya hay EF 4.1 RC que tiene la versión "final" de la API: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2dc5ddac-5a96-48b2-878d-b9f49d87569a –

+0

Cómo accediste a 'Dirección'. Debería haber una carga lenta activada. –

+0

He comprobado mis versiones. Tengo la versión de tiempo de ejecución EntityFramework.dll v4.0.30319 y la versión 4.0.0.0. Cuando uso nuget obtengo ' PM> Install-Package EntityFramework ' EntityFramework 4.1.10311.0 'ya instalado. I-mo ya tiene una referencia a 'EntityFramework 4.1.10311.0'. ' Es extraño y la carga lenta todavía no funciona. – bizon

Respuesta

5

intente esto:

Company company = context.Companies.Include("Address").Find(id); 

o con la nueva sintaxis proporcionado:

Company company = context.Companies.Include(c => c.Address).Find(id); 

Esto le dice a EF para cargar con impaciencia la entidad como Address parte de su entidad Company.

También parece que tiene una capa de repositorio encima de EF: asegúrese de que la implementación de su repositorio sea compatible con Include() si ese es el caso.

Sólo para empezar esta es la implementación de Include() que Julia Lerman ofrece en "Programación de Entity Framework" para apoyar un modelo de repositorio de datos unidad comprobable con POCOS (esta versión sólo funciona con la primera sintaxis):

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path) 
{ 
    var objectQuery = source as ObjectQuery<TSource>; 
    if (objectQuery != null) 
    { 
     return objectQuery.Include(path); 
    } 
    return source; 
} 
+1

O puede usar una extensión personalizada más genérica para incluye: http://stackoverflow.com/questions/5376421/ef-including-other-entities-generic-repository-pattern/5376637#5376637 –

Cuestiones relacionadas