Este error me apareció en una aplicación en la que tenía el siguiente esquema:
//En uno de mis repositorios
public class ProductoRepository: IProductoRepository, IDisposable
{
private MiContext context;
//Constructor
public ProductoRepository(MiContext context)
{
this.context = context;
}
//… otros métodos aquí
}
//En otro de mis repositorios
public class MarcaRepository: IMarcaRepository, IDisposable
{
private MiContext context;
//Constructor
public MarcaRepository(MiContext context)
{
this.context = context;
}
//… otros métodos aquí
}
//Y en mi controller:
public IProductoRepository repositorioProducto;
public IMarcaRepository repositorioMarca;
//Constructor
public MiController()
{
this.repositorioProducto = new ProductoRepository(new MiContext());
this.repositorioMarca = new MarcaRepository(new MiContext());
}
En los repositorios todo está bien, porque en el constructor recibimos el “context” y lo asignamos a la variable local “context”, no hay problema ahí.
Sin embargo, checa el código del “controller”. Primero creo dos variables locales, cada una para cada repositorio, y después en el constructor las asigno a una nueva instancia de la clase de cada repositorio, y paso como parámetro una nueva instancia de “MiContext” a cada una.
Precisamente esto es lo que genera el error:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
Lo que tienes que hacer es crear una sola instancia de “MiContext” en el “controller” y luego pasar esa misma a los dos constructores de los repositorios, de esta forma:
//En el controller
private MiContext context = new MiContext();
public IProductoRepository repositorioProducto;
public IMarcaRepository repositorioMarca;
//Constructor
public MiController()
{
this.repositorioProducto = new ProductoRepository(context);
this.repositorioMarca = new MarcaRepository(context);
}
De esta forma estarás trabajando con un sólo contexto y desaparecerá el error mencionado.