Подтвердить что ты не робот

Саморегуляция между кодами рекурсивных отношений ко многим ко многим первым Entity Framework

Я вообще не могу сделать эту работу

class Member
{
    public virtual IList<Member> Friends { get; set; }
    [Key]
    public int MemberId { get; set; }
    public string Name{ get; set; }
}

Я попытался добавить Mappings, но напрасно. Есть ли способ сделать это с помощью CTP5?

4b9b3361

Ответ 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; }
    }