实体框架中的多对多关系

本文关键字:关系 框架 实体 | 更新日期: 2023-09-27 18:31:33

我像这样设置了一个多对多关系(删除所有不相关的属性):

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

什么也没发生,关键字不再与品牌相关联。

我错过了什么?

谢谢!

实体框架中的多对多关系

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

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

。或者在加载制作(预先加载)时使用Include

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

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