У меня такая проблема: когда я добавляю элемент в корзину, он сохраняется (вставлена таблица отношений многие ко многим), когда я добавляю тот же элемент в эту модель, он терпит неудачу, НО ПОДОЖДИТЕ - он не выйдет из строя, если Я 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();
}