1

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

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

当我逐步完成数据库播种时,当我创建一些 Make 并创建一些关键字然后将一些关键字添加到 make 时,看起来实体已正确创建。我可以使用手表很好地在两个实体之间导航。

数据库初始化完成后,我查看数据库,看起来所有数据都在那里。但是,当我在视图中实际显示关键字时,我知道的 Makes 我分配了一个关键字的计数为 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>
                }
     }
}

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

我错过了什么?

谢谢!

4

1 回答 1

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

于 2013-09-16T17:15:49.030 回答