Я не могу понять это. Я попытался найти решение в соответствии с информацией, найденной здесь: 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 в свойства + ключи. Очевидно, что любой участник должен иметь возможность забанить друг друга.