Asp.net mvc Asp.NETMVC使用多对多关系访问属性
在我的模型中,一个人(HrPerson)可以有一个以上的头衔(HrPersonTitle)。所以我创建了下面的模型来建立两个模型之间的多对多关系 hr人员型号:Asp.net mvc Asp.NETMVC使用多对多关系访问属性,asp.net-mvc,entity-framework,ef-code-first,many-to-many,asp.net-mvc-5,Asp.net Mvc,Entity Framework,Ef Code First,Many To Many,Asp.net Mvc 5,在我的模型中,一个人(HrPerson)可以有一个以上的头衔(HrPersonTitle)。所以我创建了下面的模型来建立两个模型之间的多对多关系 hr人员型号: public class HrPerson { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<HrPersonTitle> HrPerson
public class HrPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HrPersonTitle> HrPersonTitle { get; set; }
}
public class HrPersonTitle
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection <HrPerson> HrPerson { get; set; }
}
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");
});
}
public PartialViewResult _ViewHrPersonTitle(int? personId)
{
var Titles = db.HrPersonTitle.Where(p => p.HrPerson.**(ID)???** = personId)
return PartialView(Titles);
}
似乎我无法从HrPersonTitle模型中访问HrPerson ID属性。我认为这是应该的。
我想知道获得属于一个人的所有头衔的最佳方式是什么?通常,您可以:
public PartialViewResult _ViewHrPersonTitle(int? personId)
{
var person = db.HrPerson.Find(personId);
var titles = person.HrPersonTitle.ToList(); // .ToList() is optional
return PartialView(titles);
}
另外,无法从Title实体直接联系到HrPerson的原因是您没有在entity类中声明它virtual
。
实体框架需要导航属性是虚拟的,以便延迟加载它们/与动态代理一起使用
如果不将它们声明为虚拟的,默认情况下它们不会被延迟加载。它们仍然可以通过
。包括(…)
或者懒洋洋地
.Load()
(显式加载)
但是对于您的用例,可能最好采用自动方式。非常感谢。。那么对于性能来说,哪一个更好呢?Leager还是lazy loading?还有一件事,我不能使用HrMapPersonTitle。例如,我想在控制器中创建新行,但无法访问它。延迟加载仅在实际访问时加载属性。但是,如果您确切地知道您需要什么,只显式地加载可能会更好。至于不可访问的映射表:当您创建关系时,将在其中创建一个条目。如
db.HrPerson.Find(personId.add)(newhrpersontitle())中所示代码>这将自动创建条目,并且它也会以另一种方式工作(添加到现有的HrPersonTitle)