Не удается сохранить второе обновление отношения многие ко многим в EF Core - PullRequest
0 голосов
/ 06 августа 2020

У меня такая проблема: когда я добавляю элемент в корзину, он сохраняется (вставлена ​​таблица отношений многие ко многим), когда я добавляю тот же элемент в эту модель, он терпит неудачу, НО ПОДОЖДИТЕ - он не выйдет из строя, если Я go в режим отладки и наведите указатель мыши на объект dbset (изучите его), затем медленно используйте F10, но если я сделаю это быстро, не глядя в этот набор dbset, он также не сработает. Я получаю ошибку "The instance of entity type 'MenuItem' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. . Я не знаю, что на самом деле не так, и мне нужна помощь. Весь код ниже:

Модели:

public class Cart
{
    public int Id { get; set; }
    public IList<CartItems> CartItems{ get; set; }
}

public class Item
{
    public int Id { get; set; }
    public IList<CartItems> CartItems{ get; set; }
}

public class CartItems
{
    public int Id { get; set; }

    public int CartId { get; set; }
    public Cart Cart { get; set; }

    public int ItemId { get; set; }
    public Item Item { get; set; }
}

Регистрация при запуске:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<CartItems>().HasKey(x => x.Id);
}


    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<DbContext>(opt => opt.UseNpgsql("connectonString"));
        services.AddTransient<ICartRepository, CartRepository>();
        services.AddTransient<IUnitOfWork, UnitOfWork>();
    }

Репозиторий:

    public virtual async Task UpdateAsync(Cart entity)
    {
        context.Set<Cart>.Attach(entity);
        Context.Entry(entity).State = EntityState.Modified;
        await Task.CompletedTask;
    }

    public override async Task<Cart> GetByIdAsync(int id)
    {
        return await context.Set<Cart>
            .Include(b => b.CartItems)
            .ThenInclude(x => x.Item)
            .Where(x => x.Id == id)
            .FirstOrDefaultAsync();
    }

Сервис:

public async Task<Cart> AddItemAsync(int cartId)
{
    var item = new Item { Id = 1 };
    var cart = await UnitOfWork.CartRepository.GetByIdAsync(cartId);
    var map = new CartItems
    {
        CartId = basketId,
        Cart = cart,
        ItemId= item.Id,
        Item = item
    };
    cart.BasketMenuItems.Add(map);
    // first save works, second throws The instance of entity type 'CartItem' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
    await UnitOfWork.CartRepository.UpdateAsync(cart); 
    await UnitOfWork.SaveChangesAsync();
}
...