以下是数据模型,其中实体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;
}
答案 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; }
}
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);
}
}