Дублирующее значение ключа нарушает уникальное ограничение "PK_ProductsComparsion после добавления составного ключа - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь добавить продукт в список сравнения, но если список с этим Id уже существует, то я получаю сообщение об ошибке:

PostgresException: 23505: нарушение дублированного значения ключа уникальное ограничение "PK_ProductsComparsion".

Как это исправить?

Я добавил составной ключ, но он все еще не работает.

enter image description here

enter image description here

Модели

public class ProductComparsion
{
    public int Id { get; set; }
    public int? UserId { get; set; }
    public Guid SessionId { get; set; }
    public int CategoryId { get; set; }
    public DateTime Created { get; set; }
    public ICollection<ProductToCompare> ProductsToCompare { get; set; }
}

public class ProductToCompare
{
    public int ProductComparsionId { get; set; }
    public ProductComparsion ProductComparsion { get; set; }
    public int ProductId { get; set; }
    public Product Product { get; set; }        
}

AppDbContextModelProvider

        modelBuilder.Entity<ProductComparsion>(typeBuiler =>
        {
            typeBuiler.ToTable(nameof(AppDbContext.ProductsComparsion));
            typeBuiler.HasKey(z => z.Id);
        });

        modelBuilder.Entity<ProductToCompare>(typeBuilder =>
        {
            typeBuilder.ToTable(nameof(AppDbContext.ProductsToCompare));
            typeBuilder.HasKey(z => new { z.ProductId, z.ProductComparsionId });
            typeBuilder.HasOne(z => z.ProductComparsion).WithMany(z => z.ProductsToCompare).HasForeignKey(z => z.ProductComparsionId);
            // Composite key:
            typeBuilder.HasOne(z => z.Product).WithMany().HasForeignKey(z => z.ProductId).OnDelete(DeleteBehavior.SetNull);
        });

AddProductToComparsionList

    public async Task<ProductComparsionVM> AddProductToComparsionList(List<int> productIds, int listId = 0)
    {
        var comparsionList = await _dbContext.ProductsComparsion
            .AsNoTracking()
            .FirstOrDefaultAsync(z => z.Id.Equals(listId));

        var products = _dbContext.Products.Include(z => z.ProductCategories);

        foreach (var productId in productIds)
        {
            comparsionList.ProductsToCompare.Add(new ProductToCompare { ProductId = productId });
        }                          

        // Error: can't add item with existing 'listId'
        await _dbContext.AddAsync(comparsionList);
        await _dbContext.SaveChangesAsync();
        return null;
    }
...