Entity Framework “Une entité objet ne peut pas être référencé par plusieurs instances de IEntityChangeTracker”
J'obtiens l'erreur
Une entité objet ne peut pas être référencé par plusieurs instances de
IEntityChangeTracker
lorsque vous essayez de créer une nouvelle entité et l'enregistrer dans la bd.
Je comprends l'erreur et comment il se produit normalement, mais dans ce cas tout ce que je suis en train de faire est de créer une nouvelle entité et l'ajout d'un peu de int
s avant l'enregistrement, mais pas en ajoutant toutes les autres entités à partir d'autres contextes.
J'ai inclus la fonction qui est la cause de l'erreur. Comme vous pouvez le voir, il est passé d'un EndProduct
qui est une entité qui est suivie par un contexte différent de celui dans le _billableRepository
, mais depuis que je ne suis pas en train dans de toute façon assigner l'entité nouvellement créée facturables je ne vois pas comment il peut être un problème.
Le seul moyen pour que je puisse voir l'erreur qui arrive, c'est parce qu'un couple de la int
valeurs qui sont assignés à la nouvelle Billable
sont prises à partir de l'existant EndProduct
qui est suivie par un contexte différent, mais sûrement, le IEntityChangeTracker
ne pas suivre les primitives d'une entité?
public void AddBillable(EndProduct endProduct, int? purchaseId, string centreCode, int userId)
{
if (endProduct.Product != null)
{
var existingBillableForUserForProductId = _billableRepository.GetQuery(b => b.UserId == userId && b.ProductId == endProduct.ProductId);
if (endProduct.BillablePartId != null && !existingBillableForUserForProductId.Any())
{
var billable = new Billable {
ProductId = endProduct.ProductId.Value, //int
UserId = userId, //int
PartId = endProduct.BillablePartId.Value, //int
DateAdded = DateTime.UtcNow, //datetime
PurchaseId = purchaseId, //int
CentreCode = centreCode //string
};
_billableRepository.Add(billable); //error here
_billableRepository.UnitOfWork.SaveChanges();
}
}
}
- Essayez ceci. _billableRepository.Facturables.Ajouter(facturable); _billableRepository.SaveChanges();
- Êtes-vous de l'élimination de votre contexte correctement à chaque fois? Vous devez les initialiser avant de vous en avez besoin et d'en disposer dès que possible.
Vous devez vous connecter pour publier un commentaire.
La cause la plus probable de ce qui est à faire avec l'injection de dépendance de l'outil que vous utilisez.
Il ne devrait être qu'un
DbContext
en jeu par unité de travail. Si vous êtes newing un nouveau à chaque fois, assurez-vous que le vieux est éliminé.Sinon, vous aurez de multiples instances d'un même contexte de course aux côtés les uns des autres.
C'est là que le changement de tracker devient confus et est incapable de suivre les modifications apportées à vos entités.
_billableRepository
Cet exemple de code pour résoudre le problème;
DbContext
est alaways considéré comme une mauvaise pratique. Il peut conduire à la Surcharge de la Mémoire, des Problèmes avec le MultiThreading (DbContext
n'est pas thread-safe), et beaucoup plus. Alaways en utiliser un par ce que vous définissez un Unité de Travail et être conscient de ce quiEntity
dépend de laDbContext
. Si unDbContext
est Éliminé, vous pouvez vous connecter à l'Entité à un autre Contexte de travail ou avec un Déconnecté de l'Entité, où toutes les Données Nécessaire est déjà en cache (Désireux de Chargement). Beaucoup d'Informations à ce Sujet peuvent être trouvées sur le Web.Sur votre modèle
(GetById method)
essayer de mettre quelque chose comme ceci:var billable = _db.Billable.
AsNoTracking().SingleOrDefault(i => i.BillableId == id);
Utilisation AsNoTracking() de sorte qu'elle retourne une nouvelle requête dans laquelle les entités ne seront pas mis en cache dans le
System.Data.Entity.DbContext
Vous pouvez fixer par la fixation de votre entité dans le référentiel. Comme ceci:
Où son votre DbSet dans le contexte.