Pregunta

Estoy utilizando código de EF Primero con una base de datos preexistente.

Dos objetos:

public Foo
{
    public int FooId {get;set;}
}

public Bar
{
    public int BarId {get;set;}
    public virtual Foo Foo {get;set;}
}

Tanto FooId y BarId son las claves principales en la base de datos, y la mesa tiene un Bar FooId columna que es una clave externa que apunta a la tabla Foo.

Cuando selecciono un Bar, Foo es una referencia nula. Yo hubiera pensado EF habría tirado automáticamente a los dos juntos, pero tal vez me estoy perdiendo algo?

asignaciones de base de datos:

public class EFCodeFirst : DbContext
{
    public EFCodeFirst()
    {
        this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString;
    }

    public DBSet<Foo> Foos {get;set;}
    public DBSet<Bar> Bars {get;set;}

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        modelBuilder.IncludeMetadataInDatabase = false;
        modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo");
        modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar");
    }
}
¿Fue útil?

Solución

Si su expectativa de Foo no debe ser nula viene del hecho de que usted lo hace Virtual en el objeto de bar, entonces ese no es el caso. Por hacerlos virtual, que sólo opta a EF carga diferida y será nula hasta el punto de que se diga explícitamente para ello accediendo al mismo a la barra de objetos. Aparte de eso, si usted quiere que sea poblada por adelantado que tendría que carga ansiosos con Incluir método.

Para desactivar explícitamente la carga diferida se puede utilizar el siguiente código, a pesar de que no lo necesita ya que sólo se puede quitar el Virtual palabra clave de sus propiedades de navegación y carga diferida habría desaparecido.

public EFCodeFirst()
{        
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
}

A nivel interno, DbContext utiliza un protegido ObjectContext que también se puede utilizar dentro de su clase DbContext heredada (por ejemplo EFCodeFirst).

Otros consejos

se echa en falta una línea en la clase Foo, que Foo contiene una colección de bar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top