2011-02-26 11 views
20

Este error se arroja mucho, pero no puedo encontrar la solución. Soy nuevo en el Marco de la Entidad y en mi primer enfoque obtuve este error.C# Entity Framework "Un objeto de entidad no puede ser referenciado por varias instancias de IEntityChangeTracker"

Esto es lo que tengo. Tengo una clase de empresa y una clase de sucursal. Ambas clases tienen su propio repositorio. Una empresa tiene una sucursal, mientras que una sucursal puede tener varias compañías.

En mi interfaz gráfica de usuario que rellene un combo con objetos Branch, que me sale de mi BranchRepository:

public IList<Branch> GetAllBranches() 
    { 
     var query = _context.Branches; 

     IList<Branch> branches = query.ToList(); 

     return branches; 
    } 

Esto es resultado es el origen de datos del cuadro combinado rama.

Cuando quiero salvar a la compañía, que hacer algo como esto:

company.VisitorAddress = txtVisitAddress.Text; 
company.City = txtCity.Text; 
company.CompanyName = txtCompany.Text; 
company.PhoneNumber = txtPhoneNumber.Text; 
company.ZipCode = txtZipcode.Text; 
company.Branch = ((Branch)cmbBranches.SelectedItem); 
company.Website = txtWebsite.Text; 

A continuación, llamar a mi repositorio de empresa para salvar mi empresa. Esto es lo que el método save parece:

public bool Save(Company company) 
{ 
    _context.AddToCompanies(company); // <-- This is where the error is thrown. 
    _context.SaveChanges(); 

    return true; 
} 

Cuando se invoca el método save, me sale el error 'Un objeto entidad no puede ser referenciado por varias instancias de IEntityChangeTracker'.

Claramente estoy haciendo algo mal, pero ¿qué?

Respuesta

22

¿Crea una nueva instancia de ObjectContext para cada uno de sus repositorios? Esa podría ser una fuente de problema porque cuando agrega Branche a Company, intenta agregarlo a la instancia ObjectContext, lo que no se puede hacer porque todavía está relacionado con la instancia ObjectContext utilizada para llenar el cuadro combinado. El camino a seguir es compartir la instancia ObjectContext entre sus repositorios. Otra posibilidad es Detach Branch del primer repositorio, pero puede tener otras consecuencias.

+0

Sí, cada repositorio tiene su propio 'ObjectContext'. Entonces, ¿cómo puedo de una manera ordenada compartir el 'ObjectContext'? ¿Está utilizando un singleton de una buena manera? – Martijn

+0

Ningún singleton no es una buena manera - verifique mi respuesta aquí: http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 El camino a seguir puede ser pasar la instancia de ObjectContext al repositorio constructor pero luego debe manejar SaveChanges fuera del repositorio. –

+0

Estoy usando winforms. Pero no veo cómo compartir el 'ObjectContext'. No quiero que el cliente conozca este contexto. – Martijn

Cuestiones relacionadas