C# 无法跟踪实体类型的实例,因为另一个实例。。。更新数据库时发生EF核心错误

C# 无法跟踪实体类型的实例,因为另一个实例。。。更新数据库时发生EF核心错误,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,服务: public Cart AddProductToCart(Product product, Cart cart) { var productExist = _dbContexet.CartProduct.Where(cp => cp.ProductId == product.Id).FirstOrDefault(); var quantityOfCart = _dbContexet.CartProduct.Where(cp => cp.CartId == ca

服务:

public Cart AddProductToCart(Product product, Cart cart)
{
    var productExist = _dbContexet.CartProduct.Where(cp => cp.ProductId == product.Id).FirstOrDefault();
    var quantityOfCart = _dbContexet.CartProduct.Where(cp => cp.CartId == cart.Id).FirstOrDefault().Quantity;

    CartProduct cartProduct = new CartProduct();
    cartProduct.CartId = cart.Id;
    cartProduct.ProductId = product.Id;

    if (productExist != null)
    {
        cartProduct.Quantity = quantityOfCart + 1;
        _dbContexet.Attach(cartProduct).State = EntityState.Modified;
    }
    else
    {
        cartProduct.Cart = cart;
        cartProduct.Product = product;
        _dbContexet.CartProduct.Add(cartProduct);
    }
    _dbContexet.SaveChanges();
    return cart;
}
完全错误:

InvalidOperationException:实体类型“CartProduct”的实例 无法跟踪,因为另一个实例的键值与 {'CartId','ProductId'}已被跟踪。连接时 现有实体,请确保只有一个实体实例具有给定的 随附关键值。考虑使用 “DbContextOptions Builder.EnableSensivedAtalogging”以查看 相互冲突的键值

我有多对多和表
CartProduct
我想检查产品是否存在,如果存在只更新数量,但我得到这个错误

Eddit:

产品:

public partial class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Category { get; set; }
        public decimal CostToMake { get; set; }
        public decimal FinalPrice { get; set; }
        //public int? OrderId { get; set; }

        public virtual Order Order { get; set; }
        public List<CartProduct> CartProduct { get; set; }
    }
弗伦塔皮:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.HasAnnotation("Relational:Collation", "Cyrillic_General_CI_AS");

            modelBuilder.Entity<Day>(entity =>
            {
                entity.Property(e => e.Date).HasColumnType("date");

                entity.Property(e => e.MostCommonCategory)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.MostCommonProduct)
                    .IsRequired()
                    .HasMaxLength(100)
                    .IsUnicode(false);

                entity.Property(e => e.TotalMade).HasColumnType("decimal(18, 3)");

                entity.Property(e => e.TotalSpent).HasColumnType("decimal(18, 3)");
            });

            modelBuilder.Entity<Order>(entity =>
            {
                entity.Property(e => e.Date).HasColumnType("date");               

                entity.Property(e => e.Status)
                    .IsRequired()
                    .HasMaxLength(100)
                    .IsUnicode(false);

                entity.Property(e => e.Name).HasMaxLength(100);

                entity.Property(e => e.Address).HasMaxLength(150);

                entity.Property(e => e.PhoneNumber).HasMaxLength(20);
            });

            modelBuilder.Entity<Product>(entity =>
            {
                entity.HasIndex(e => e.OrderId, "IX_Products_OrderId");

                entity.Property(e => e.Category)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.CostToMake).HasColumnType("decimal(18, 3)");

                entity.Property(e => e.FinalPrice).HasColumnType("decimal(18, 3)");

                entity.Property(e => e.Name)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.Price).HasColumnType("decimal(18, 3)");

                entity.HasOne(d => d.Order)
                    .WithMany(p => p.Products)
                    .HasForeignKey(d => d.OrderId);
            });

            modelBuilder.Entity<Cart>(entity => {
                entity.HasKey(e => e.Id);
                entity.HasOne(e => e.User)
                .WithOne(e => e.Cart)
                .HasForeignKey<AppUser>(e => e.CartId);
            });

            modelBuilder.Entity<CartProduct>()
            .HasKey(e => new { e.CartId, e.ProductId });

            modelBuilder.Entity<CartProduct>()
            .HasOne(t => t.Cart)
            .WithMany(t => t.CartProduct)
            .HasForeignKey(t => t.ProductId);

            modelBuilder.Entity<CartProduct>()
            .HasOne(t => t.Product)
            .WithMany(t => t.CartProduct)
            .HasForeignKey(t => t.CartId);

            OnModelCreatingPartial(modelBuilder);
        }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
HasAnnotation(“关系:排序规则”、“西里尔文”通用词“);
modelBuilder.Entity(Entity=>
{
entity.Property(e=>e.Date).HasColumnType(“日期”);
属性(e=>e.MostCommonCategory)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(假);
Property(e=>e.MostCommonProduct)
.IsRequired()
.HasMaxLength(100)
.IsUnicode(假);
Property(e=>e.totalmake.HasColumnType(“decimal(18,3)”);
Property(e=>e.totalExplored).HasColumnType(“decimal(18,3)”);
});
modelBuilder.Entity(Entity=>
{
entity.Property(e=>e.Date).HasColumnType(“日期”);
entity.Property(e=>e.Status)
.IsRequired()
.HasMaxLength(100)
.IsUnicode(假);
Property(e=>e.Name).HasMaxLength(100);
Property(e=>e.Address).HasMaxLength(150);
Property(e=>e.PhoneNumber).HasMaxLength(20);
});
modelBuilder.Entity(Entity=>
{
entity.HasIndex(e=>e.OrderId,“IX_产品_OrderId”);
entity.Property(e=>e.Category)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(假);
Property(e=>e.CostToMake).HasColumnType(“decimal(18,3)”);
Property(e=>e.FinalPrice).HasColumnType(“decimal(18,3)”);
entity.Property(e=>e.Name)
.IsRequired()
.HasMaxLength(50)
.IsUnicode(假);
Property(e=>e.Price).HasColumnType(“decimal(18,3)”);
entity.HasOne(d=>d.Order)
.有许多(p=>p.产品)
.HasForeignKey(d=>d.OrderId);
});
modelBuilder.Entity(Entity=>{
entity.HasKey(e=>e.Id);
entity.HasOne(e=>e.User)
.WithOne(e=>e.Cart)
.HasForeignKey(e=>e.CartId);
});
modelBuilder.Entity()
.HasKey(e=>new{e.CartId,e.ProductId});
modelBuilder.Entity()
.HasOne(t=>t.Cart)
.WithMany(t=>t.CartProduct)
.HasForeignKey(t=>t.ProductId);
modelBuilder.Entity()
.HasOne(t=>t.Product)
.WithMany(t=>t.CartProduct)
.HasForeignKey(t=>t.CartId);
OnModelCreatingPartial(modelBuilder);
}

您的错误是因为:

 cartProduct.CartId = cart.Id;
 cartProduct.ProductId = product.Id;

在现实中,这与:

 cartProduct.Cart = cart;
 cartProduct.Product = product;
因此,只需从代码中删除:

 cartProduct.Cart = cart;
 cartProduct.Product = product;

您可以使用EF功能以不同的方式执行某些操作

public Cart AddProductToCart(Product product, Cart cart)
{
  var product = _dbContexet.Product.Where(cp => cp.ProductId == product.Id).Include(x => x.CartProduct).FirstOrDefault();
  var quantityOfCart = _dbContexet.CartProduct.Where(cp => cp.CartId == cart.Id).FirstOrDefault().Quantity;
  var cartProduct = product.CartProduct.Where(x=>x.CartId == cart.id).FirstOrDefault();

  if (cartProduct != null)
  {
    cartProduct.Quantity = quantityOfCart + 1;
  }
  else
  {
     product.CartProduct.Add(new CartProduct { CartId = cart.id });
  }

  //_dbContexet.Update(product) if you are using QueryTrackingBehavior.NoTracking
  _dbContexet.SaveChanges();
  return cart;
}

你能提供类
Cart
Product
CartProduct
?@OxQ我用类和fluent api编辑了这篇文章。
 cartProduct.Cart = cart;
 cartProduct.Product = product;
public Cart AddProductToCart(Product product, Cart cart)
{
  var product = _dbContexet.Product.Where(cp => cp.ProductId == product.Id).Include(x => x.CartProduct).FirstOrDefault();
  var quantityOfCart = _dbContexet.CartProduct.Where(cp => cp.CartId == cart.Id).FirstOrDefault().Quantity;
  var cartProduct = product.CartProduct.Where(x=>x.CartId == cart.id).FirstOrDefault();

  if (cartProduct != null)
  {
    cartProduct.Quantity = quantityOfCart + 1;
  }
  else
  {
     product.CartProduct.Add(new CartProduct { CartId = cart.id });
  }

  //_dbContexet.Update(product) if you are using QueryTrackingBehavior.NoTracking
  _dbContexet.SaveChanges();
  return cart;
}