Asp.net mvc Asp.net Mvc代码首先是具有附加属性的多对多代码

Asp.net mvc Asp.net Mvc代码首先是具有附加属性的多对多代码,asp.net-mvc,ef-code-first,many-to-many,navigation-properties,Asp.net Mvc,Ef Code First,Many To Many,Navigation Properties,据我所知,我有两种方法首先使用代码在asp.NETMVC中实现多对多关系 1-流畅的Api public class HrPerson { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<HrPersonTitle> HrPersonTitle { get; set; } } public class HrPersonTitle { pub

据我所知,我有两种方法首先使用代码在asp.NETMVC中实现多对多关系

1-流畅的Api

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 Title { get; set; }
  public virtual ICollection<HrPerson> HrPerson { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<HrPerson>()
  .HasMany(s => s.HrPersonTitle)
  .WithMany(c => c.HrPerson)
  .Map(t =>
     {
        t.MapLeftKey("HrPersonId")
         .MapRightKey("HrPersonTitleId")
         .ToTable("HrMapPersonTitle");
     });
}
公共类人力资源人员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection HrPersonTitle{get;set;}
}
公共类HrPersonTitle
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection HrPerson{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(s=>s.HrPersonTitle)
.WithMany(c=>c.HrPerson)
.Map(t=>
{
t、 MapLeftKey(“HrPersonId”)
.MapRightKey(“HrPersonTitleId”)
.ToTable(“HrMapPersonTitle”);
});
}
2-自定义映射表

    public class HrPerson
    {
      public int Id { get; set; }
      public string Name { get; set; }
      public virtual ICollection<HrMapPersonTitle> HrMapPersonTitle { get; set; }
    }

    public class HrPersonTitle
    {
      public int Id { get; set; }
      public string Title { get; set; }
      public virtual ICollection<HrMapPersonTitle> HrMapPersonTitle { get; set; }
    }

   public class HrMapPersonTitle
    {
        public int Id { get; set; }
        public int HrPersonId { get; set; }
        public int HrPersonTitleId { get; set; }
        public virtual HrPerson HrPerson { get; set; }
        public virtual HrPersonTitle HrPersonTitle { get; set; }
        public string Note { get; set; }
        public bool Deleted { get; set; }
    }
公共类人力资源人员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection hrmapperOntitle{get;set;}
}
公共类HrPersonTitle
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection hrmapperOntitle{get;set;}
}
公共类HrMapPersonTitle
{
公共int Id{get;set;}
public int HrPersonId{get;set;}
public int HrPersonTitleId{get;set;}
公共虚拟人HrPerson{get;set;}
公共虚拟HrPersonTitle HrPersonTitle{get;set;}
公共字符串注释{get;set;}
公共bool已删除{get;set;}
}
我的问题是:

如果选择第二种方式,则无法从视图中的HrPerson模型中访问HrPersonTitle.Name属性。我怎样才能到达酒店

如果我选择第一种方式,我可以访问HrPersonTitle.Name,但我无法在映射文件中添加更多属性?如何添加更多属性

关于。

当您创建一个没有有效负载(只有外键关系,没有额外数据)的M2M时,EF会折叠该关系,以便您可以直接查询,而不必显式地遍历联接表。但是,如果您需要有效负载,EF将无法再以这种方式管理关系

因此,如果您想获得标题,您必须通过
HrMapPersonTitle

@foreach (var title in Model.HrMapPersonTitle)
{
    @title.HrPersonTitle.Name
}

这两种方法似乎都有些过分。我不知道你的全部意图,但我一直在工作中实施这一点,我使用以下方法:

public class HrPerson
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<HrPersonTitle> HrPersonTitles { get; set; }
}

public class HrPersonTitle
{
  public int Id { get; set; }
  public string Title { get; set; }
  public virtual ICollection<HrPerson> HrPersons { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<HrPerson>()
  .HasMany(s => s.HrPersonTitles)
  .WithMany(c => c.HrPersons);
}
公共类人力资源人员
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection HrPersonTitles{get;set;}
}
公共类HrPersonTitle
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection HrPersons{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(s=>s.HrPersonTitles)
.有许多人(c=>c.hr人);
}
如果您首先使用代码,并且尝试访问DbContext中的任何一个映射,那么它应该延迟加载您的信息,并且每个属性都应该是可访问的


不过我有一个问题。您确定应该是多对多,他们真的有多个标题吗?

谢谢您的回答,是的,他们可以有多个标题:)但是使用您编写的方法,我无法向EF为我创建的映射表中添加更多属性。我不确定这是这种情况下的最佳做法。当然,另一张有正确关系的桌子会更好吗?