Duplicate key value violates unique constraint "PK_ProductsComparsion после добавления составного ключа

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

PostgresException: 23505: duplicate key value violates unique constraint "PK_ProductsComparsion". How canI fix this?

Добавил составной ключ, но ошибка не исчезла

введите сюда описание изображения

введите сюда описание изображения

Models

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;
}

Ответы (1 шт):

Автор решения: WinnerIT

Ваша проблема в том, что пытаетесь записать в таблицу ProductComparsion второй раз запись с одинаковым ID. У Вас не может быть в таблице две записи с одинаковым ID и декларации поля unique. Введение составного ключа ProductToCompare не решит Вашу проблеме кроме этого нарушает одну из 5 нормальных форм.

В Вашем случаи я вижу 2 решения:

  1. Вы убираете unique и соотвественно primary key со столбца ID в ProductComparsion
  2. Реализуете по столбцу ID в ProductComparsion autoincrement (в БД или в Вашем коде)

Мое мнение - вторый вариант правильный

Удачи!

→ Ссылка