Как определить два ФК в одной таблице? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть таблица с именем User, которая наследует свойства от IdentityUser, внутри этой таблицы я добавил ссылку на таблицу UserFriendship, в которой нужно хранить все дружеские отношения с пользователем:

public class User : IdentityUser
{
    public string FirstName { get; set; } 
    public DateTime BirthDate { get; set; }

    public virtual ICollection<UserFriendship> UserFriendship { get; set; }
}

По существу, UserFriendship содержит двух пользователей, которые имеют общую дружбу, вот определение модели:

public class UserFriendship
{
    public int Id { get; set; }

    [Key, ForeignKey("UserA")]
    public string UserAId { get; set; }
    public User UserA { get; set; }

    [Key, ForeignKey("UserB")]
    public string UserBId { get; set; }
    public User UserB { get; set; }

    [Required]
    public DateTime DateTime { get; set; }
}

Я определил UserA и UserB, которые являются двумя FK User, которые содержатся внутри AspNetUsers таблицы.

Теперь внутри FluentAPI я объявил следующее:

builder.Entity<UserFriendship>(entity =>
{
    entity.HasKey(f => f.Id);

    entity.HasOne(u => u.UserA)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserAId)
          .IsRequired();

    entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
 });

при выполнении этой команды:

add-migration InitialMigration -context MyAppContext

Я получу:

Невозможно создать связь между 'User.UserFriendships' и 'UserFriendship.UserB', потому что уже существует связь между 'User.UserFriendships' и'UserFriendship.UserA.Свойства навигации могут участвовать только в одном отношении.

Я не эксперт по EnityFramework, но, исходя из этой ошибки, я думаю, что не могу определить два FK в одной таблице?

Извините за любую ошибку, спасибо.

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете определить более одного FK в таблице.Проблема в том, что вы дважды указываете на одно свойство навигации - UserFriendships.Решение состоит в том, чтобы создать два свойства навигации.

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

Попробуйтеthis:

public class User
{
    public string FirstName { get; set; }
    public DateTime BirthDate { get; set; }

    public ICollection<UserFriendship> UserAFriendships { get; set; }
    public ICollection<UserFriendship> UserBFriendships { get; set; }
}

public class UserFriendship
{
    public int Id { get; set; }

    public string UserAId { get; set; }
    public User UserA { get; set; }

    public string UserBId { get; set; }
    public User UserB { get; set; }
    public DateTime DateTime { get; set; }
 }

И определите отношение через свободный интерфейс API следующим образом:

modelBuilder.Entity<UserFriendship>(entity =>
{
     entity.HasKey(f => f.Id);

     entity.HasOne(u => u.UserA)
         .WithMany(n => n.UserAFriendships)
         .HasForeignKey(u => u.UserAId)
         .IsRequired();

     entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserBFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
});

Более того - вам не нужно указывать атрибуты Key, ForeignKey, если вы используете Fluent API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...