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 шт):
Ваша проблема в том, что пытаетесь записать в таблицу ProductComparsion второй раз запись с одинаковым ID. У Вас не может быть в таблице две записи с одинаковым ID и декларации поля unique. Введение составного ключа ProductToCompare не решит Вашу проблеме кроме этого нарушает одну из 5 нормальных форм.
В Вашем случаи я вижу 2 решения:
- Вы убираете unique и соотвественно primary key со столбца ID в ProductComparsion
- Реализуете по столбцу ID в ProductComparsion autoincrement (в БД или в Вашем коде)
Мое мнение - вторый вариант правильный
Удачи!

