EF代码 - 首先如何使用Entity检索导航属性?

时间:2018-06-04 21:19:46

标签: c# entity-framework

以下是数据模型,其中实体A具有导航属性B

[Serializable]
public class X
{   
    [Key]
    public int Id { get; set; }             
}

[Serializable]
public class A : X
{     
    public List<B> B { get; set; }
}

[Serializable]
public class B : X
{
    public int AId { get; set; }
    public A A { get; set; }
}

然后,我试图从数据库访问表A,如下所示:

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;
    }
}

这几乎有效,但对于集合A中返回的temp的每个实例,B的值为null。由于每个A在数据库中都有一个非null B,我对db.Set<T>()

的结果感到惊讶

问题

  • 为什么我得到这个结果?
  • db.Set<T>()如何使用有效(非空)A来返回B,需要做什么?

更新 根据@Camilo Terevinto的建议,我试了以下,没有运气

public class MyDatabaseContext : DbContext
{
    Configuration.LazyLoadingEnabled = true;
}

2 个答案:

答案 0 :(得分:0)

由于您明确处置了上下文并且禁用了延迟加载,因此您需要急切地加载关系:

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

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

答案 1 :(得分:-1)

我不知道为什么你得到null价值。通常,这是在实体框架中配置one-to-one的方式。

使用SelectAsync方法运行以下代码时,B的每个值都会获得A

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; }
}

的DbContext

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);
    }
}