Отношение «многие ко многим» в первом коде EF4 - PullRequest
9 голосов
/ 30 июня 2010

Как вы представляете отношение «многие ко многим» в ETP4 Code-First CTP3?

Например, если у меня есть следующие классы:

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Profile> Profiles { get; set; }
}

class Profile
{
    public int Id { get; set; }
    public string Name { get; set; }
}

В базе данных естьтаблица UserProfiles, которая имеет FK для пользователя и FK для профиля.Как я могу сопоставить это?

РЕДАКТИРОВАТЬ: я понимаю, как в настоящее время сопоставить с наличием свойства ICollection<User> на Profile, но я действительно не хочу иметь противоположное свойство навигации, когда онодолжно быть «У пользователей много профилей».

Ответы [ 2 ]

8 голосов
/ 14 июля 2010

РЕДАКТИРОВАТЬ : CTP4 был выпущен поздно вечером (14 июля 2010 года), и теперь есть поддержка для этого:

modelBuilder.Entity<Post>().HasMany(p => p.Tags).WithMany();


Я узнал наконец , что это в настоящее время невозможно.Microsoft надеется добавить эту функцию (только одно свойство навигации).

Для получения дополнительной информации см. Эту ссылку на форумах MSDN: http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

5 голосов
/ 13 мая 2011

При многих отношениях вы должны включить навигационные свойства с обеих сторон и сделать их виртуальными (чтобы использовать ленивую загрузку)

class User
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<Profile> Profiles { get; set; }
}

class Profile
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<User> Users { get; set; }
}

Затем с помощью этой настройки вы можете определить ваши отношения «многие ко многим» (вы также можете позволить платформе сущностей сделать это за вас, но мне не нравятся соглашения об именах, которые она использует).

        modelBuilder.Entity<Profile>().
            HasMany(p => p.Users).
            WithMany(g => g.Profiles).
            Map(t => t.MapLeftKey("ProfileID")
                .MapRightKey("UserID")
                .ToTable("UserProfiles"));

Это даст вам таблицу с именем UserProfiles с UserID и ProfileID в качестве ключей.

...