objet entité ne peut pas être référencé par plusieurs instances de IEntityChangeTracker. lors de l'ajout d'objets liés à l'entité dans l'Entity Framework 4.1
Je suis en train d'enregistrer les informations sur les Employés, qui a des références à la Ville. Mais chaque fois que j'essaie de sauvegarder mes contact, qui est validé je reçois l'exception "ADO.Net Cadre de l'Entité Une entité objet ne peut pas être référencé par plusieurs instances de IEntityChangeTracker"
J'avais lu beaucoup de post, mais toujours pas à obtenir l'exacte idée de quoi faire...
mon bouton Enregistrer, cliquez sur le code est donné ci-dessous
protected void Button1_Click(object sender, EventArgs e)
{
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
DateTime dt = new DateTime(2008, 12, 12);
Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();
Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));
e1.Name = "Archana";
e1.Title = "aaaa";
e1.BirthDate = dt;
e1.Gender = "F";
e1.HireDate = dt;
e1.MaritalStatus = "M";
e1.City = city1;
es.AddEmpoyee(e1,city1);
}
et Employeeservice Code
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
{
Payroll_DAO1 payrollDAO = new Payroll_DAO1();
payrollDAO.AddToEmployee(e1); //Here I am getting Error..
payrollDAO.SaveChanges();
return "SUCCESS";
}
Vous devez vous connecter pour publier un commentaire.
Parce que ces deux lignes ...
... ne prenez pas un paramètre dans le constructeur, je suppose que vous créer un contexte dans les classes. Lorsque vous chargez le
city1
......vous fixez le
city1
le contexte dansCityService
. Plus tard, vous ajoutez uncity1
comme une référence à la nouvelleEmployee
e1
et ajoutere1
y compris cette référence àcity1
le contexte dansEmployeeService
. En conséquence, vous avezcity1
attaché à deux autre contexte, qui est ce que l'exception se plaint.Vous pouvez résoudre ce problème par la création d'un contexte à l'extérieur des classes de services et de l'injection et de l'utiliser dans les deux services:
Votre service des classes ressemblent un peu à des référentiels qui ne sont responsables que d'un seul type d'entité. Dans un tel cas, vous aurez toujours de la difficulté dès que les relations entre les entités sont impliqués lorsque vous utilisez des contextes différents pour les services.
Vous pouvez également créer un service unique qui est responsable d'un ensemble d'entités étroitement liées, comme un
EmployeeCityService
(à un seul contexte) et délégué à l'ensemble de l'opération dans votreButton1_Click
méthode à une méthode de ce service.Form
(ce que jamais, il est juste représente une unité de travail) parThread
(parce queDbContext
n'est pas garanti d'être thread-safe).Étapes pour reproduire peut être simplifié à ceci:
Code sans erreur:
L'aide d'une seule
EntityContext
pouvez résoudre ce problème. Se référer à d'autres réponses pour d'autres solutions.C'est un vieux thread, mais une autre solution, que je préfère est de simplement mettre à jour le cityId et de ne pas attribuer le trou de la Ville modèle de l'Employé... pour que l'Employé devrait ressembler à:
Alors qu'il suffit d'attribution:
J'ai eu le même problème mais mon problème avec le @Slauma de la solution (bien que grand dans certains cas), c'est qu'il recommande des que je passe le contexte dans le service, ce qui implique que le contexte est disponible à partir de mon contrôleur. Il est également des forces de couplage étroit entre mon contrôleur et les couches de service.
Je suis en utilisant l'Injection de Dépendance pour injecter le service/dépôt de couches sur le contrôleur et en tant que tels n'ont pas accès au contexte de l'automate.
Ma solution a été d'avoir le service/dépôt des couches d'utiliser la même instance du contexte - Singleton.
Contexte De La Classe Singleton:
Référence: http://msdn.microsoft.com/en-us/library/ff650316.aspx
et http://csharpindepth.com/Articles/General/Singleton.aspx
Classe De Dépôt:
D'autres solutions existent comme l'instanciation le contexte une fois et de passer dans le constructeur de votre service/dépôt de couches ou d'une autre, j'ai lu à propos de ce qui est de la mise en œuvre de l'Unité de Travail modèle. Je suis sûr qu'il ya plus...
En alternative à l'injection et pire encore Singleton, vous pouvez appeler Détacher méthode avant de les Ajouter.
EntityFramework 6:
((IObjectContextAdapter)cs).ObjectContext.Detach(city1);
EntityFramework 4:
cs.Detach(city1);
Il y a encore une autre manière, dans le cas où vous n'avez pas besoin de première DBContext objet. Juste envelopper avec à l'aide de mot-clé:
dbContext1.Entry(backgroundReport).State = System.Data.Entity.EntityState.Detached
' à détacher, puis a été en mesure d'utiliserdbContext2.Entry(backgroundReport).State = System.Data.Entity.EntityState.Modified;
de mise à jour. Travaillé comme un rêveDans mon cas, j'ai été en utilisant le ASP.NET l'Identité de Cadre. J'avais utilisé le construit en
UserManager.FindByNameAsync
méthode pour récupérer unApplicationUser
entité. J'ai ensuite essayé de faire référence à cette entité une entité nouvellement créée sur un autreDbContext
. Cela a abouti à l'exception d'origine que vous avez vu.J'ai résolu ce problème en créant un nouveau
ApplicationUser
entité avec seulement leId
de laUserManager
méthode et le référencement de cette nouvelle entité.J'ai eu le même problème et j'ai pu résoudre en faire une nouvelle instance de l'objet que j'ai essayé de mettre à Jour. Puis j'ai passé l'objet de mon reposotory.
Dans ce cas, il s'avère que l'erreur est très clair: Entity Framework ne peut pas suivre une entité à l'aide de plusieurs instances de
IEntityChangeTracker
, ou généralement, plusieurs instances deDbContext
. Les solutions sont: utiliser une instance deDbContext
; tous les accès nécessaires entités par le biais d'un référentiel unique (selon un exemple deDbContext
); ou de désactiver le suivi de toutes les entités d'y accéder via un référentiel autre que celui de jeter cette exception particulière.Lorsque à la suite d'une inversion de modèle de contrôle dans .Net Web de Base de l'API, j'ai souvent je trouve que j'ai des contrôleurs avec des dépendances telles que:
et l'utilisation comme
Depuis les trois dépôts dépendent de différents
DbContext
cas par demande, j'ai deux options pour éviter le problème et maintenir des dépôts: modification de l'injection de la DbContext pour créer une nouvelle instance qu'une seule fois par appel:ou, si l'enfant entité est utilisé en lecture seule, la désactivation de suivi sur l'instance:
Utiliser le même DBContext objet tout au long de la transaction.
Source de l'erreur:
Espère que quelqu'un permet de gagner un temps précieux