EF Core „Eine weitere Instanz wird bereits verfolgt“C#

Ein Treffpunkt für C#-Programmierer
Guest
 EF Core „Eine weitere Instanz wird bereits verfolgt“

Post by Guest »

Ich habe ein Problem beim Aktualisieren einer Entität in .Net Core 2.2.0 mit EF Core 2.2.3.


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);
Die Scoped-Lebensdauer ist standardmäßig festgelegt, aber ich habe sie so geschrieben, dass sie einfacher zu verstehen ist.

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;
}
Und die Methode Update() sieht so aus:

Code: Select all

using (var transaction = _context.Database.BeginTransaction())
{
try
{
_context.Anomalies.Update(anomaly);
_context.SaveChanges();

transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
}
Es enthält einige Prüfungen vor dieser Transaktion, aber keine ist in diesem Zusammenhang relevant genug.

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]

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post