Sto ottenendo l'errore
Un oggetto entità non può essere referenziato da più istanze di IEntityChangeTracker
quando si tenta di creare una nuova entità e salvarla nel DB.
Comprendo l'errore e il modo in cui si verifica normalmente, ma in questo caso tutto ciò che sto facendo è creare una nuova entità e aggiungerne alcuni int
prima di salvare, non aggiungere altre entità da altri contesti.
Ho incluso la funzione che sta causando l'errore. Come puoi vedere, viene passato un EndProduct
che è un'entità che viene tracciata da un contesto diverso da quello nel _billableRepository
, ma dal momento che non sto provando ad assegnare comunque quell'entità al conto appena creato, non lo faccio guarda come può essere un problema.
L'unico modo in cui posso vedere che l'errore si verifica è perché un paio dei valori int
assegnati al nuovo Billable
sono presi EndProduct
esistente che viene tracciato da un contesto diverso, ma sicuramente IEntityChangeTracker
non tiene traccia dell'individuo primitivi di un'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();
}
}
}
La causa più probabile di questo è lo strumento di iniezione delle dipendenze che stai utilizzando.
Dovrebbe esserci solo un DbContext
in gioco per unità di lavoro. Se ne stai iniziando uno nuovo ogni volta, assicurati che quello vecchio sia stato eliminato.
Altrimenti, si avranno più istanze dello stesso contesto che corrono l'una accanto all'altra.
È qui che il tracker delle modifiche viene confuso e non è in grado di tenere traccia delle modifiche alle entità.
Sul tuo modello (GetById method)
prova a mettere qualcosa del genere:
var billable = _db.Billable.
AsNoTracking () .SingleOrDefault(i => i.BillableId == id);
Utilizzare AsNoTracking () in modo che restituisca una nuova query in cui le entità non verranno memorizzate nella cache in System.Data.Entity.DbContext