Невозможно создать отношения при использовании двух FK - PullRequest
0 голосов
/ 19 октября 2018

Я использую EF в моем ASP.Net Core приложении и пытаюсь связать таблицу UserNotification с моей User таблицей.Это структура таблиц:

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

    public virtual UserNotifications { get; set; }
}

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

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

    [Key, ForeignKey("Sender")]
    public string SenderId { get; set; }
    public virtual User Sender { get; set; }      

    public string Title { get; set; }
    public string Message { get; set; }
}

Я создал ForeignKey из UserNotifications, в котором я собираюсь хранить все уведомления, полученные User.

Внутри таблицы UserNotifications Я создал два FK для User и Sender.По сути, я хочу сохранить Id из User, который получил уведомление, и Id из User, который отправил уведомление (Sender).

Внутри OnModelCreating Я также определил следующую логику:

builder.Entity<UserNotifications>(entity =>
{
    entity.HasKey(n => n.Id);
    entity.HasOne(u => u.User)
          .WithOne(u => u.UserNotifications)
          .HasForeignKey<User>(u => u.Id);

    entity.HasOne(u => u.Sender)
          .WithOne(u => u.UserNotifications)
          .HasForeignKey<User>(u => u.Id);
 });

Когда я набираю следующее здание в console:

add-migration InitialMigration -context MyAppContext

, я получаю:

Невозможно создать связь между «User.UserNotifications» и «UserNotifications.Sender», поскольку уже существует связь между «UserNotifications.User» и «User.UserNotifications».Свойства навигации могут участвовать только в одной взаимосвязи.

Я новичок в EntityFramework, поэтому я не знаю, как это исправить, кто-то может объяснить, что я сделал не так?

Заранее спасибо за любую помощь.

1 Ответ

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

Модель, которую вы описываете, представляет две отношения один-ко-многим между User и UserNotifications (кстати, сущность должна называться UserNotification) сущностями.Каждое отношение EF может быть сопоставлено с 0 или 1 уникальными навигационными свойствами на каждой стороне.

У вас уже есть два User и Sender эталонные навигационные свойства (и соответствующие FK) в UserNotifications.Что вам нужно, это два соответствующих свойства навигации по коллекции в User:

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

    public virtual ICollection<UserNotifications> ReceivedNotifications { get; set; }
    public virtual ICollection<UserNotifications> SentNotifications { get; set; }
}

и сопоставление с беглым API:

builder.Entity<UserNotifications>(entity =>
{
    entity.HasKey(n => n.Id);

    entity.HasOne(n => u.User)
        .WithMany(u => u.ReceivedNotifications)
        .HasForeignKey(n => u.UserId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Delete);

    entity.HasOne(n => n.Sender)
        .WithMany(u => u.SentNotifications)
        .HasForeignKey(n => n.SenderId)
        .IsRequired()
        .OnDelete(DeleteBehavior.Restrict);
 });

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

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