在我的模型中,一个人(HrPerson)可以拥有一个以上的标题(HrPersonTitle)。所以我创建了下面的模型来建立两个模型之间的多对多关系。
HrPerson模型:
public class HrPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HrPersonTitle> HrPersonTitle { get; set; }
}
HrPersonTitle模型:
public class HrPersonTitle
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection <HrPerson> HrPerson { get; set; }
}
在我的DbContext类中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<HrPerson>()
.HasMany(s => s.HrPersonTitle)
.WithMany(c => c.HrPerson)
.Map(t =>
{
t.MapLeftKey("HrPersonId")
.MapRightKey("HrPersonTitleId")
.ToTable("HrMapPersonTitle");
});
}
当我更新数据库时,已创建 HrMapPersonTitle 。我认为很多很多关系(?)
我的问题是控制器动作。我的目标是获得属于任何人的所有标题。我实现了以下代码。
控制器:
public PartialViewResult _ViewHrPersonTitle(int? personId)
{
var Titles = db.HrPersonTitle.Where(p => p.HrPerson.**(ID)???** = personId)
return PartialView(Titles);
}
似乎我无法从HrPersonTitle模型到达HrPerson-ID属性。我认为应该是这样。 我想知道什么是获得属于一个人的所有头衔的最好方法?
答案 0 :(得分:0)
通常,您可以这样做:
public PartialViewResult _ViewHrPersonTitle(int? personId)
{
var person = db.HrPerson.Find(personId);
var titles = person.HrPersonTitle.ToList(); // .ToList() is optional
return PartialView(titles);
}
此外,您无法直接从Title实体到达HrPerson的原因是您未在实体类中声明它virtual
。
实体框架需要虚拟导航属性,以便延迟加载/使用动态代理。
如果您未声明virtual
,则默认情况下,不会延迟加载。
.Include(..)
或懒洋洋地
.Load()
(明确加载)。
但是对于你的用例,可能最好采用自动方式。