2014-02-18 58 views
0

我有一个多对多的关系设置,使我在我的上下文中;实体框架6代码首先许多到多选择始终为空

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

将返回我适当的模块,但问题的元素为null。 (在数据库中检查这显示模块3有40个问题。)

断点显示正在命中OnModelCreating。虽然如果有帮助,但我注意到,在模型构建器中错误地引用引号中的任何元素都不会导致错误,所以我怀疑我正在调用/正确设置它。

那么为什么问题是空的,它应该包含40个问题元素的列表?

回答

1

它不会自行发生。你必须告诉EF你使用Include加载问题:

_context.Modules.Include(m => m.Questions).Where(m => m.ModuleId == 3); 

如果Module.Questions属性标记为virtual(见卡夫的例子),它应该正常工作。只要您访问Module.Questions属性,问题将立即加载。但是,这将是第二个数据库查询,而在使用Include时,问题将与单个数据库请求中的模块一起查询。

+0

如果我使用你提出的语法,我会得到一个错误,“不能将Lambda表达式转换为键入'string'”。 但是使用包含(“问题”)的作品。所以,你的语法应该如何工作,我错过了某些事情? – Matt

+0

@Matt:对于'Include'的lambda版本,您必须在代码文件中添加'using System.Data.Entity;'。 – Slauma

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

} 
+0

我没有在构造函数中实例化集合,虽然我有属性。这意味着我不再有空集合的问题,但它仍然没有填充。 – Matt