Саморегуляция между кодами рекурсивных отношений ко многим ко многим первым Entity Framework
Я вообще не могу сделать эту работу
class Member
{
public virtual IList<Member> Friends { get; set; }
[Key]
public int MemberId { get; set; }
public string Name{ get; set; }
}
Я попытался добавить Mappings, но напрасно. Есть ли способ сделать это с помощью CTP5?
Ответы
Ответ 1
По соглашению, Code First будет принимать однонаправленные ассоциации как один для многих. Поэтому вам нужно использовать свободный API, чтобы Code First знал, что вы хотите иметь много-много ассоциаций для самостоятельной привязки:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany();
}
Примечание. Известная ошибка в CTP5, которая не позволит вам настроить имена столбцов таблицы соединений в этом сценарии.
Ответ 2
Если я прав, вы можете повлиять на имя многого имени таблицы с помощью этого кода:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany().Map(m =>
{
m.MapLeftKey("MemberId");
m.MapRightKey("FriendId");
m.ToTable("MembersFriends");
}
);
}
надеюсь, что это поможет.
Ответ 3
Вы можете заставить это работать в EF 4 CTP5 с использованием модели First, но CTP5 Code First имеет слишком много ошибок с конфигурациями с самореферентным и полиморфным запросом, чтобы использовать Code First для таких сценариев. Мортеза Манави (см. Другой ответ) задокументировал несколько из них в своем блоге.
Ответ 4
Ваш пример не является отношением "многие ко многим", это скорее рекурсивное отношение.
Я не уверен, как это исправить. Но проблема с вашим кодом в том, что вы получите два поля в одной строке с тем же именем. MemberId для id строки и MemberId для идентификатора друга.
Edit
Попробуйте сделать это следующим образом:
class Member
{
[Key]
public int MemberId { get; set; }
public string Name { get; set; }
public virtual IList<FriendRelationship> Friends { get; set; }
}
class FriendRelationship
{
[Key]
public int RelationshipId { get; set; }
public Member Friend { get; set; }
}