实体框架6代码优先多对多选择始终为空

时间:2014-02-18 15:57:16

标签: c# entity-framework ef-code-first

我有多对多的关系设置,以便在我的背景下我有;

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个问题元素的列表?

2 个答案:

答案 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时,问题将与单个数据库请求中的模块一起查询。