The instance of entity type cannot be tracked because another instance of this type with the same key is already being tracked
Without overriding EF track system, you can also Detach the 'local' entry and attach your updated entry before saving :
// var local = _context.Set<YourEntity>() .Local .FirstOrDefault(entry => entry.Id.Equals(entryId));// check if local is not null if (local != null){ // detach _context.Entry(local).State = EntityState.Detached;}// set Modified flag in your entry_context.Entry(entryToUpdate).State = EntityState.Modified;// save _context.SaveChanges();
UPDATE:To avoid code redundancy, you can do an extension method :
public static void DetachLocal<T>(this DbContext context, T t, string entryId) where T : class, IIdentifier { var local = context.Set<T>() .Local .FirstOrDefault(entry => entry.Id.Equals(entryId)); if (!local.IsNull()) { context.Entry(local).State = EntityState.Detached; } context.Entry(t).State = EntityState.Modified;}
My IIdentifier
interface has just an Id
string property.
Whatever your Entity, you can use this method on your context :
_context.DetachLocal(tmodel, id);_context.SaveChanges();
public async Task<Product> GetValue(int id) { Product Products = await _context.Products.AsNoTracking().FirstOrDefaultAsync(x => x.Id == id); return Products; }
AsNoTracking()