实体框架中的多对多关系

时间:2013-09-16 17:03:32

标签: c# entity-framework asp.net-mvc-4 ef-code-first

我建立了这样的多对多关系(删除所有不相关的属性):

public class Makes
{
  [Key]
  public int MakeId { get; set; }

  public ICollection<KeyWords> KeyWords {get; set;}
}

public class KeyWords 
{
   public KeyWords()
   {
       Makes = new HashSet<Makes>();
   }

   [Key]
   public int KeyWordsId { get; set;}
   public string KeyWord { get; set;}
}

然后在上下文定义中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<KeyWords>().HasMany(w => w.Makes).WithMany(kw => kw.KeyWords).Map(
           m =>
           {
                m.MapLeftKey("KeyWords_KeyWordsID");
                m.MapRightKey("Makes_MakesID");
                m.ToTable("MakesKeyWords");
            });

        base.OnModelCreating(modelBuilder);
    }

当我逐步完成数据库播种时,看起来当我创建一些Makes并创建一些关键词然后在make中添加一些关键词时,正确创建了实体。我可以使用手表在两个实体之间导航。

数据库初始化完成后,我查看数据库,看起来所有数据都在那里。但是,当我在视图中实际显示关键字时,使我知道我分配了关键字的计数为0:

@if (Model != null)
{
    Foreach(models.Makes item in model.Makes)
    {
        if (item.KeyWords.Count > 0) 
                {
                    <div class="KeyWords">
                    @foreach (Models.KeyWords kw in item.KeyWords)
                    {
                        <span class="KeyWord">@kw.KeyWord</span>
                    }
                    </div>
                }
     }
}

没有任何反应,关键字不再与制作相关联。

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

将导航属性标记为virtual以启用延迟加载 ...

public virtual ICollection<KeyWords> KeyWords {get; set;}

...或在加载品牌时使用Include急切加载):

var makes = context.Makes.Include(m => m.KeyWords).ToList();

(您的代码文件中using System.Data.Entity;的lambda版本需要Include。)