Die Instanz der entity-Typ 'Element' kann nicht verfolgt werden, weil eine andere Instanz mit dem gleichen key-Wert für {'Id'} bereits verfolgt wird
Ich bin mir bewusst, dass diese Frage schon gefragt wurde, aber die Lösung hat mir nicht geholfen.
[Fact]
public async Task UpdateAsync()
{
string newTitle = "newTitle1";
int newBrandId = 3;
var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
item.BrandId = newBrandId;
item.Title = newTitle;
storeContext.Entry(item).State = EntityState.Detached;
await service.UpdateAsync(item); //exception inside
var updatedItem = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
Assert.Equal(newTitle, updatedItem.Title);
Assert.Equal(newBrandId, updatedItem.BrandId);
}
public async Task UpdateAsync(T entity)
{
_dbContext.Entry(entity).State = EntityState.Modified; //exception when trying to change the state
await _dbContext.SaveChangesAsync();
}
Meldung: System.InvalidOperationException : Die Instanz der entity-Typ 'Element' kann nicht verfolgt werden, weil eine andere Instanz mit dem gleichen key-Wert für {'Id'} bereits verfolgt wird. Bei der Befestigung der vorhandenen Einrichtungen, sicherzustellen, dass nur eine Instanz der Entität mit einem bestimmten Schlüssel-Wert angefügt wird. Erwägen Sie die Verwendung 'DbContextOptionsBuilder.EnableSensitiveDataLogging' zu sehen, die widersprüchlichen wichtige Werte.
interessant, die Ausnahme ist das gleiche, auch wenn kein Element retreived von db, wie so
//var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
var item = new Item()
{
Id = 1,
BrandId = newBrandId,
CategoryId = 1,
MeasurementUnitId = 1,
StoreId = 1,
Title = newTitle
};
- versuchen Sie, um diese zu entfernen
storeContext.Entry(item).State = EntityState.Detached;
erstellen und dann posten manuell ein, wie Sie am Ende Ihre Frage - stellen Sie sicher, dass die
DbContext
verwendet in Ihren unit-teststoreContext
ist die gleiche Instanz, die verwendet wird in Ihrem serviceservice
. - Sicherstellen, dass sich keine anderen thread zu halten, kann dieses Objekt
- die gleichen, nichts hat sich geändert. Fehler bewahrt auch mit nur einem test laufen, so dass ich Zweifel threads.
- es ist das gleiche, nur verpackt im repository.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zahlreichen Fragen, die ich habe ausgeführt zu haben, eine böse Wurzel.
Kurz gesagt: ich habe die harte Tour gelernt, warum dbContext bezieht sich eher als singleton. Hier ist der Store-Typ, aber das Problem war das gleiche.
Hier ist die vereinfachte test-Initialisierung-code
Ich Las Fehler aus und haben endlich mitbekommen, dass das wichtigste Wort
So hat es einige verwaiste verfolgt Instanz hindert mich daran, das arbeiten mit speichern. Ich habe nicht speichern keine Verweise auf
s1
oders2
, so muss es seinstoreContext
Speicherung der Verweise auf die eingefügten Objekte auch nach verlassen Gültigkeitsbereich Ihrer Deklaration und Initialisierung. Das ist, warum ich war nicht in der Lage aktualisieren von Variablen normal und auch der Grund, warum meine 'abgefragt' aus dem db-Objekte hatten alle Ihre navigation Eigenschaften zugeordnet (lazy loading hat das wenig zu tun). Der folgende code gelöst alle meine Probleme.Dass ist einer der vielen Gründe warum dbContext sollte begrenzt werden, indem ein Geltungsbereich.
Vielen Dank für die Hinweis.