C# EF代码首先如何使用实体检索导航属性?

C# EF代码首先如何使用实体检索导航属性?,c#,entity-framework,C#,Entity Framework,下面是一个数据模型,其中实体a具有导航属性B 由于您正在显式地处理上下文,并且禁用了延迟加载,因此需要急切地加载关系: await dataTable.Include("B").ToListAsync(); 您需要决定如何确定当前T是否包含导航B。我无法解释为什么会得到空值。通常,以下是如何在实体框架中配置一对一 当使用SelectAsync方法运行以下代码时,对于A的每个值,我都会得到B DbContext Re:延迟加载请查看问题的更新。我事先不知道t将包含什么导航属性。这就是为什么我需要

下面是一个数据模型,其中实体a具有导航属性B


由于您正在显式地处理上下文,并且禁用了延迟加载,因此需要急切地加载关系:

await dataTable.Include("B").ToListAsync();

您需要决定如何确定当前T是否包含导航B。

我无法解释为什么会得到空值。通常,以下是如何在实体框架中配置一对一

当使用SelectAsync方法运行以下代码时,对于A的每个值,我都会得到B

DbContext
Re:延迟加载请查看问题的更新。我事先不知道t将包含什么导航属性。这就是为什么我需要一个通用的解决方案。唯一真正的解决方案是通过参数传递要包含的数据。仅启用延迟加载是不够的,因为disposalMarking this作为答案,因为它虽然不是泛型的,但确实有效。@NGambit不幸的是,实际的泛型解决方案相当困难,因为它将涉及大量反射,以确定哪些属性是导航的并加载它们。这可能会非常慢,您最好将数据传递到via参数中
public class MyDatabaseContext : DbContext
{
    Configuration.ProxyCreationEnabled = false;
}

public async Task<IEnumerable<T>> SelectAsync<T>() where T : X
{
    using (MyDatabaseContext db = new MyDatabaseContext ())
    {
        var dataTable = db.Set<T>();
        var temp = await dataTable.ToListAsync();

        return temp;
    }
}
public class MyDatabaseContext : DbContext
{
    Configuration.LazyLoadingEnabled = true;
}
await dataTable.Include("B").ToListAsync();
public partial class X
{
    public int Id { get; set; }

    public virtual A A { get; set; }

    public virtual B B { get; set; }
}

public partial class A
{
    public A()
    {
        B = new HashSet<B>();
    }

    public int Id { get; set; }

    public virtual X X { get; set; }

    public virtual ICollection<B> B { get; set; }
}

public partial class B
{
    public int Id { get; set; }

    public int? AId { get; set; }

    public virtual A A { get; set; }

    public virtual X X { get; set; }
}
public partial class MyDatabaseContext : DbContext
{
    ...

    public virtual DbSet<A> A { get; set; }
    public virtual DbSet<B> B { get; set; }
    public virtual DbSet<X> X { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<X>()
            .HasOptional(e => e.A)
            .WithRequired(e => e.X);

        modelBuilder.Entity<X>()
            .HasOptional(e => e.B)
            .WithRequired(e => e.X);
    }
}