Самостоятельная ссылка «многие ко многим» с несколькими ключевыми аргументами - PullRequest
0 голосов
/ 02 мая 2018

Я не могу понять это. Я попытался найти решение в соответствии с информацией, найденной здесь: ASP.Net Forum , но эта проблема достаточно отличается, чтобы не работать для меня.

Это мой сценарий:

public class ApplicationUser
{
    public int Id { get; set; }
    public ICollection<CustomerContractorBan> Bans { get; set; }
}


public enum BanType
{
    Contractor,
    Customer
}

public class CustomerContractorBan
{
    public BanType BannedBy { get; set; }

    [ForeignKey(nameof(CustomerId))]
    public ApplicationUser Customer { get; set; }

    public int CustomerId { get; set; }

    [ForeignKey(nameof(ContractorId))]
    public ApplicationUser Contractor { get; set; }

    public int ContractorId { get; set; }

    public DateTimeOffset Time { get; set; }
}


    /// <inheritdoc />
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CustomerContractorBan>().HasKey(d => new { d.ContractorId, d.CustomerId, d.BannedBy });

        modelBuilder.Entity<CustomerContractorBan>()
            .HasOne(d => d.Contractor)
            .WithMany(d => d.Bans)
            .HasForeignKey(d => new { d.ContractorId })
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<CustomerContractorBan>()
            .HasOne(d => d.Customer)
            .WithMany(d => d.Bans)
            .HasForeignKey(d => new { d.CustomerId })
            .OnDelete(DeleteBehavior.Restrict);
    }

Чего я пытаюсь достичь:

  • Пользователь 1 должен иметь возможность заблокировать пользователя 2 с BannedBy = Исполнитель
  • Пользователь 2 должен иметь возможность забанить пользователя 1 с BannedBy = Customer

Исключение, которое я получаю в настоящее время:

Невозможно создать связь между ApplicationUser.Bans и «CustomerContractorBan.Customer», потому что уже есть отношения между ApplicationUser.Bans и 'CustomerContractorBan.Contractor. Свойства навигации могут только участвовать в одиноких отношениях

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

PS: Раньше это работало, пока я не добавил BannedBy в свойства + ключи. Очевидно, что любой участник должен иметь возможность забанить друг друга.

...