Asp.net mvc Asp.NETMVC使用多对多关系访问属性

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

在我的模型中,一个人(HrPerson)可以有一个以上的头衔(HrPersonTitle)。所以我创建了下面的模型来建立两个模型之间的多对多关系

hr人员型号:

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)