Не удается добавить элемент с существующим идентификатором в базу данных - PullRequest
0 голосов
/ 23 марта 2020

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

Экземпляр типа объекта «ProductToCompare» не может быть отслежен, потому что другой экземпляр с значение ключа '{ProductComparsionId: 13}' уже отслеживается

Что я делаю не так?

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

EF:

public class AppDbContext : CmsDbContextBase, ILocalizedDbContext
{
    public DbSet<ProductComparsion> ProductsComparsion { get; set; }
    public DbSet<ProductToCompare> ProductsToCompare { get; set; }
}

public class AppDbContextModelProvider : ModelProvider
{
    protected override void OnModelCreating(DbContext dbContext, ModelBuilder modelBuilder)
    {
        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 => z.ProductComparsionId);
            typeBuilder.HasOne(z => z.ProductComparsion).WithMany(z => z.ProductsToCompare).HasForeignKey(z => z.ProductComparsionId);
        });
    }
}

Добавление данных в БД:

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

        Guid sessionId = default;
        Guid.TryParse(_httpContextAccessor.HttpContext.Session.Id, out sessionId);

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

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

            var user = _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User).GetAwaiter().GetResult();
            comparsionList.UserId = user == null ? null : (int?)user.Id;
        }                          

        await _dbContext.AddAsync(comparsionList);
        await _dbContext.SaveChangesAsync();
        return null;
    }

Редактировать 1

enter image description here

enter image description here

1 Ответ

1 голос
/ 23 марта 2020

Ключ для модели ProductToCompare настроен как ProductComparisonId, и для этого свойства также настроена связь между моделями ProductToCompare и ProductComparison.

Поэтому при добавлении экземпляр ProductToCompare в ProductComparison.ProductsToCompare, экземпляр ProductToCompare получает ProductComparison экземпляр ProductComparisonId. Как только вы добавите более одного ProdcutToCompare к ProductComparison, у вас будет два экземпляра ProductToCompare с одинаковым ProductComparisonId ... одним и тем же ключом. Вот почему вы получаете сообщение об ошибке.

Добавьте Id к ProductToCompare и сделайте его ключом, или, возможно, сделайте его составным между ProductId и ProductComparisonId, чтобы исправить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...