Asp.net Mvc代码首先有许多附加属性

时间:2014-02-21 15:59:15

标签: asp.net-mvc ef-code-first many-to-many navigation-properties

据我所知,我有两种方法可以使用代码优先在asp.net mvc中实现多对多关系。

1- Fluent 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");
     });
}

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; }
    }

我的问题:

如果我选择第二种方式,我无法从视图中的HrPerson模型到达HrPersonTitle.Name属性。我怎样才能到达这些房产?

如果我选择第一种方式我可以到达HrPersonTitle.Name但我无法在地图文件中添加更多属性?如何添加更多属性?

问候。

2 个答案:

答案 0 :(得分:1)

当你创建一个没有有效负载的M2M (只是外键关系,没有额外的数据)时,EF会折叠关系,这样你就可以直接查询而无需明确地通过连接表。但是,如果您需要有效负载,则EF无法再以这种方式管理关系。

所以,如果你想获得标题,你必须经历HrMapPersonTitle

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

答案 1 :(得分:0)

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

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);
}

如果您首先使用代码并尝试访问DbContext中的任一映射,则应该延迟加载您的信息,并且每个属性都应该是可访问的。

我确实有一个问题。你确定它应该是多对多,他们真的有多个头衔吗?