2016-06-18 3 views
0

У меня есть одна сущность, и я хочу создать два отношения Много-ко-многим. Моя организация является:EF Code First - Fluent API - отношение многих ко многим - не создание таблицы

public class User : IdentityUser 
{ 
    private ICollection<User> users; 
    private ICollection<User> followers; 
    private ICollection<User> followings; 

    public User() 
    { 
     this.Users = new HashSet<User>(); 
     this.Followers = new HashSet<User>(); 
     this.Followings = new HashSet<User>(); 
    } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public virtual ICollection<User> Users 
    { 
     get { return this.users; } 
     set { this.users = value; } 
    } 

    public virtual ICollection<User> Followers 
    { 
     get { return this.followers; } 
     set { this.followers = value; } 
    } 

    public virtual ICollection<User> Followings 
    { 
     get { return this.followings; } 
     set { this.followings = value; } 
    } 
} 

Мой класс конфигурация выглядит следующим образом:

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     Property(u => u.FirstName).HasMaxLength(50).IsRequired(); 
     Property(u => u.LastName).HasMaxLength(50).IsRequired(); 

     HasMany<User>(u => u.Users).WithMany(f => f.Followers).Map(m => 
     { 
      m.ToTable("UserFollower"); 
      m.MapLeftKey("UserId"); 
      m.MapRightKey("FollowerId");     
     }); 
     HasMany<User>(u => u.Users).WithMany(f => f.Followings).Map(m => 
     { 
      m.ToTable("UserFollowing"); 
      m.MapLeftKey("UserId"); 
      m.MapRightKey("FollowingId"); 
     }); 
    } 
} 

Этот код создает только одну таблицу UserFollowing вместо двух таблиц UserFollowing и UserFollower. Если я поменяю местами таблицы, то получаю только UserFollower. Кажется, что вторая таблица перезаписывает первую. Я попытался удалить миграцию и базу данных, но я все равно получаю тот же результат.

У кого-нибудь есть идея, почему это происходит?

+0

Для конструктора UserMap необходим параметр, указывающий, создает ли он последователей или подписчиков. В настоящее время карта пользователя создает «Последователи», а затем переписывает объект с помощью «Подписок». – jdweng

ответ

1

Проблема заключается в том, что вы пытаетесь создать два сопоставления M: N против одного и того же свойства навигации - Пользователи. Вам на самом деле не нужно это делать, хотя за то, чего вы пытаетесь достичь. Чтобы сопоставить, какой пользователь следует за ним, вам нужна только одна таблица сопоставления.

Попробуйте установить его так:

HasMany<User>(u => u.Following).WithMany(f => f.Followers).Map(m => 
    { 
     m.ToTable("UserFollowing"); 
     m.MapLeftKey("UserId"); 
     m.MapRightKey("FollowingId");     
    }); 

Теперь вы можете получить доступ После на пользователя, чтобы выяснить, кто они следуют, и Последователи выяснить, кто за ними.

Я подозреваю, что вам действительно не нужно, чтобы это свойство Пользователя, по крайней мере, для целей доступа к данным. Вы можете использовать свойство get only, чтобы вернуть объединение коллекции Follow and Followers, хотя вам нужен список, который объединяет оба.

Смежные вопросы