我有多对多的关系设置,以便在我的背景下我有;
protected override void OnModelCreating(DbModelBuilder modelBuilder){
modelBuilder.Entity<Module>().HasMany(m => m.Questions).WithMany()
.Map(q =>
{
q.ToTable("Modules_And_Questions");
q.MapLeftKey("ModuleId");
q.MapRightKey("QuestionId");
});
base.OnModelCreating(modelBuilder);
}
public virtual DbSet<Module> Modules { get; set; }
public virtual DbSet<Question> Questions { get; set; }
执行
_context.Modules.Where(m => m.ModuleId == 3);
将返回适当的模块,但questions元素为null。 (在数据库中检查此信息表明模块3有40个问题。)
断点显示正在命中OnModelCreating。虽然如果有帮助,我注意到错误拼写模型构建器中引号中的任何元素都不会导致错误,所以我怀疑我正在调用/正确设置它。
那么为什么问题为空,何时它应该包含40个问题元素的列表?
答案 0 :(得分:1)
您是否已将问题作为集合添加到Module类中?试试这个
public class Medule
{
//Constructor
public Medule()
{
Questions = new HashSet<Question>();
}
//List of Module properties
public ModuleId {get; set;}
//Question
public virtual ICollection<Question> Questions { get; set; }
}
答案 1 :(得分:1)
它本身不会发生。您必须告诉EF您想要使用Include
加载问题:
_context.Modules.Include(m => m.Questions).Where(m => m.ModuleId == 3);
如果Module.Questions
属性标记为virtual
(请参阅Kaf的示例),它也应该可以正常工作。一旦您访问Module.Questions
属性,就会加载问题。但是,这将是第二个数据库查询,而在使用Include
时,问题将与单个数据库请求中的模块一起查询。