【问题标题】:Asp.net Mvc Code First Many to Many with Additional PropertiesAsp.net Mvc 代码优先多对多和附加属性
【发布时间】:2014-02-21 15:59:14
【问题描述】:

据我所知,我有两种方法可以使用代码优先在 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 但我无法在地图文件中添加更多属性?如何添加更多属性?

问候。

【问题讨论】:

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


    【解决方案1】:

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

    所以,要想拿到称号,就得通过HrMapPersonTitle

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

    【讨论】:

      【解决方案2】:

      这两种方法似乎都有些矫枉过正。我不知道您的全部意图,但是我一直在工作中实现这一点,并且我使用以下内容:

      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 中的任一映射,则它应该延迟加载您的信息并且每个属性都应该可以访问。

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

      【讨论】:

      • 感谢您的回答,是的,它们可以有多个标题 :) 但是使用您编写的方法,我无法向 EF 为我创建的映射表添加更多属性。
      • 我不确定在这种情况下这是最佳做法。当然,另一个具有正确关系的表会更好吗?
      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多