“Un object d’entité ne peut pas être référencé par plusieurs instances de IEntityChangeTracker.”

J’utilise le serveur MYSql comme firebase database derrière mon application de formulaire Windows. Il y a deux schémas dans ma firebase database dans lesquels je dois lancer des entrées. J’ai créé deux objects de contexte, un pour chaque schéma. Lorsque j’utilise contextA qui se trouve sur schema1, toutes les entrées sont parfaitement exécutées, mais lorsque j’utilise contextB, je reçois cette exception. Cela a-t-il quelque chose à voir avec le pilote MySql?

Cette erreur indique que vous essayez de lier une entité à votre contexte mais qu’elle est déjà attachée à une autre.

Je soupçonne qu’il ne s’agit probablement pas d’une référence directe, mais que l’une des propriétés de navigation de votre contexte contient une entité liée à l’autre contexte. À mon avis (d’après ce que vous avez décrit), les contextes distincts ne devraient vraiment être utilisés que s’il s’agit de structures d’object déconnectées, c’est-à-dire qu’ils n’ont pas de FK entre les contextes.

L’autre chose à éviter est de veiller à ce que, pour chaque unité de travail, vous n’utilisiez qu’une seule instance de chaque contexte. Si vous essayez d’utiliser une entité provenant d’une autre instance de contexte, cette erreur se produira également.

MODIFIER:

Les ID sont généralement une meilleure idée à utiliser si vous souhaitez conserver la scope en dehors du contexte actuel. Vous pouvez rattacher des entités à EF afin de les append de la manière que vous décrivez, mais vous devez vous assurer que le contexte d’origine est supprimé ou que l’entité est détachée, puis l’attacher manuellement au nouveau contexte avec les éléments suivants:

  public DbEntityEntry EnsureAttachedEF(T entity) { var e = m_Context.Entry(entity); if (e.State == EntityState.Detached) { m_Context.Set().Attach(entity); e = m_Context.Entry(entity); } return e; } 

Cependant, cela représente un peu de travail, donc utiliser des identifiants est généralement une meilleure idée.

Il est presque certainement causé par des mandataires et le suivi des modifications. Désactivez ces fonctionnalités dans les deux constructeurs et voyez si cela résout votre problème.

 public class contextA : DbContext { public contextA() { Configuration.ProxyCreationEnabled = false; } } 

Déplacement du commentaire à la réponse:

Il semble que vous travailliez peut-être avec l’entité en dehors du contexte EF. Cela ferait en sorte que les modifications apscopes à l’entité ne soient pas suivies. En même temps, EF mettrait en cache cette entité et si vous essayez de la lier au contexte, il verra que celle-ci existe déjà et émettra une erreur.

Vous pouvez utiliser l’option NoTracking dans EF pour empêcher EF de mettre en cache l’entité si vous travaillez avec elle en dehors du contexte.