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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


+ 8 = doce