Asp.net Mvc Code - сначала многие ко многим с дополнительными свойствами

Насколько я знаю, у меня есть два способа реализовать отношение "многие ко многим" в asp.net mvc с использованием кода "сначала".

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

2-Custom Таблица сопоставления

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

Мои вопросы:

Если я выберу второй способ, я не смогу достичь свойства HrPersonTitle.Name из модели HrPerson в представлении. Как я могу добраться до недвижимости?

Если я выберу первый способ, я смогу связаться с HrPersonTitle.Name, но не смогу добавить больше свойств в файл карты? Как я могу добавить больше свойств?

С уважением.

2 ответа

Решение

Когда вы создаете 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);
}

Если вы сначала используете код и пытаетесь получить доступ к любому из отображений в DbContext, он должен Lazy Load вашу информацию, и каждое свойство должно быть доступно.

У меня есть один вопрос, хотя. Вы уверены, что должно быть много ко многим, у них действительно есть многократные названия?

Другие вопросы по тегам