错误:“无法跟踪实体类型“Produtos”的实例

问题描述 投票:0回答:1

您好,我正在尝试将产品列表添加到我的订单中,但我在 C# 代码中遇到异常: System.InvalidOperationException: '无法跟踪实体类型 'Products' 的实例,因为另一个具有键值的实例“{Id: 1}”已被跟踪。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。我尝试了一些解决方案,但无法解决问题。我正在内存数据库中用于我的测试应用程序。

 public class Pedidos
    {
        [Key]
        public int Id { get; set; }
        public string Descricao { get; set; }
        public decimal Valor { get; set; }
        public DateTime DataCriacao { get; set; } = DateTime.Now;
        public List<Produtos> ProdutosPedido { get; set; }
    }

public class Produtos
    {
        public int Id { get; set; }
        public string Descricao { get; set; }

        public int FornecedorId { get; set; }

        public Fornecedores Fornecedores { get; set; }

        public int TributacaoId { get; set; }

        public Tributacoes Tributacoes { get; set; }
    }
 public Pedidos Adicionar(Pedidos pedido)
        {
            _dbContext.Pedido.Add(pedido);
            _dbContext.SaveChanges(); //error here
            return pedido;
        }
 {
    "id": 2,
    "descricao": "Pedido 1",
    "valor": 52.36,
    "dataCriacao": "2023-08-25T08:59:59.4587309-03:00",
    "produtosPedido": [ //class produto
      {
        "id": 1,
        "descricao": "Teste Produto",
        "fornecedorId": 1,
        "tributacaoId": 1,
      }
    ]
  }
public class EFDBContext : DbContext
    {
        public EFDBContext(DbContextOptions<EFDBContext> options) : base(options)
        {

        }
        public DbSet<TipoDespesas> TipoDespesa { get; set; }
        public DbSet<Fornecedores> Fornecedor { get; set; }
        public DbSet<Tributacoes> Tributacao { get; set; }
        public DbSet<Produtos> Produto { get; set; }
        public DbSet<Pedidos> Pedido { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseInMemoryDatabase("BC-Teste");
            optionsBuilder.EnableSensitiveDataLogging();
        }
    }

我已经尝试修改产品状态。

c# entity-framework .net-6.0 in-memory-database
1个回答
0
投票

这里的问题是因为您尝试添加的 Pedidos 对象被视为与数据库中现有的实例相同。

我建议您在检索 Pedidos 对象时使用 “AsNoTracking()”

这样

public async Task<Pedidos> GetPedidos(int id){ Pedidos pedido= await _context.Pedidos .AsNoTracking().FirstOrDefaultAsync(x => x.Id == id); return pedido; }
    
© www.soinside.com 2019 - 2024. All rights reserved.