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