Beim Speichern der Änderungen ist ein Fehler aufgetreten. Fehlerdetails:
Die Instanz des Entitätstyps „Asset“ kann nicht verfolgt werden, da bereits eine andere Instanz mit demselben Schlüsselwert für {‘Id‘} verfolgt wird. Stellen Sie beim Anhängen vorhandener Entitäten sicher, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert angehängt wird. Erwägen Sie die Verwendung von
So wird der DB-Kontext registriert:
Dienste .AddDbContext(options =>
Code: Select all
options.UseSqlServer(Configuration.GetConnectionString("DbConnection")), ServiceLifetime.Scoped);
Das Anomaly-Objekt sieht folgendermaßen aus:
Code: Select all
public IQueryable GetAll()
{return _context.Anomalies.Include(a => a.Asset).Include(a => a.Level)
}
public async Task GetAnomaly(int anomalyId, User user)
{
var anomaly = await GetAll()
.FirstOrDefaultAsync(a => a.Id == anomalyId);
return anomaly;
}
Code: Select all
using (var transaction = _context.Database.BeginTransaction())
{
try
{
_context.Anomalies.Update(anomaly);
_context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
}
Hier erhalte ich die Fehlermeldung, dass die Instanz bereits verfolgt wird. Ich kann nicht verstehen, wie das passiert. Wenn der Kontext Scoped ist, dann
... "eine neue Instanz des Dienstes wird für jeden Bereich erstellt, in diesem Fall für jede Anfrage
Wenn mein Kontext auf der PUT-Anfrage anders ist Wie wird die Entität im Kontext der GET-Anfrage bereits verfolgt? Wie funktioniert das auf den grundlegendsten Ebenen?
Die einzige Möglichkeit, es zum Laufen zu bringen, besteht darin, den Status für alle Einträge aus dem ChangeTracker auf EntityState zu setzen. Freigestellt. Dann funktioniert es.. aber es macht keinen Sinn, zumindest nach meinem aktuellen Wissensstand.
Ich habe diese Frage gefunden, aber ohne gültige Antwort, nur mit Problemumgehungen und Annahmen dazu wie EF das Tracking durchführt.
UPDATE
Hier ist ein Link zu Bitbucket mit einem Beispiel, das dieses Problem nachstellt: EF Core Update Beispiel
Ich habe die aus dem Kontext abgerufenen Objekte serialisiert.
Mit Tracking auf der LINKEN Seite Ohne Tracking auf der RECHTEN Seite
[img]https://i .sstatic.net/9N9vK.png[/img]