实体框架中的多对多关系
本文关键字:关系 框架 实体 | 更新日期: 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
。