您好,我正在尝试将产品列表添加到我的订单中,但我在 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();
}
}
我已经尝试修改产品状态。
这里的问题是因为您尝试添加的 Pedidos 对象被视为与数据库中现有的实例相同。
我建议您在检索 Pedidos 对象时使用 “AsNoTracking()”
这样
public async Task<Pedidos> GetPedidos(int id){
Pedidos pedido= await _context.Pedidos
.AsNoTracking().FirstOrDefaultAsync(x => x.Id == id);
return pedido;
}