Asp.Net MVC使用多对多关系实现该属性

时间:2013-12-08 18:17:45

标签: asp.net-mvc entity-framework ef-code-first many-to-many asp.net-mvc-5

在我的模型中,一个人(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属性。我认为应该是这样。 我想知道什么是获得属于一个人的所有头衔的最好方法?

1 个答案:

答案 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()(明确加载)。

但是对于你的用例,可能最好采用自动方式。