Estou na aula 2 parte 7 do Curso Entity Framework Core: Banco de dados de forma eficiente e estou tendo problemas com uma exceção quando tento atualizar uma linha da minha tabela de Dados.
Na aula nós criamos um ProductDAO (DataAssetObject) de um produto da nossa loja para guardar num banco de dados.
using System;
using System.Collections.Generic;
using System.Linq;
namespace DataBaseStudy
{/// <summary>
/// Product Data Asset Object. This is a class that will help to manage the DataBase from this Product.
/// </summary>
class ProductDAO : IDAO<Product>, IDisposable
{
public StoreContext Context { get; }
public ProductDAO()
{
Context = new StoreContext();
}
public void RefreshElement(Product obj)
{
Context.Products.Update(obj);
Context.SaveChanges();
}
public void Dispose()
{
if (Context != null)
{
Context.Dispose();
}
}
}
}
Quando eu quero atualizar algum campo que está no Database (Exemplo: Preço do produto mudou de R$100 para R$50) eu chamo minha função Refresh Element(Product obj) como argumento aquele mesmo objeto, só com uma propriedade com valor diferente. Quando ele passa pelo Update estoura uma exceção de Operação Inválida cuja a mensagem é essa:
System.InvalidOperationException: 'The instance of entity type 'Product' cannot be tracked because another instance of this type with the same key is already being tracked. When adding new entities, for most key types a unique temporary key value will be created if no key is set (i.e. if the key property is assigned the default value for its type). If you are explicitly setting key values for new entities, ensure they do not collide with existing entities or temporary values generated for other new entities. When attaching existing entities, ensure that only one entity instance with a given key value is attached to the context.'
Se eu deletar o objeto anterior, criar um novo e salvar ele eu resolveria o problema, mas me cheira uma má pratica (AKA Gambiarra).