Mahlzeit,
ich verwende AutoMapper um meine Entitäten von und zu DTO Entitäten zu mappen, funktioniert auch ohne Probleme.
Das Problem kommt erst, wenn ich dann mit der gemappten Entität arbeite.
Ich habe eine Translation Entity und eine Language Entity. (1:n)
Language hat n Translations.
Language language = applicationDbContext.Languages.FirstOrDefault(x => x.Name == "pl-t");
LanguageDTO mappedLanguage = new LanguageDTO();
mapper.Map(language, mappedLanguage);
//Input from ui
TranslationDTO translation = new TranslationDTO
{
Identifier = "dtoTrans",
Text = "dtoTrans",
Language = mappedLanguage, //Does not work
LanguageId = mappedLanguage.Id, //Works
Id = Guid.NewGuid()
};
Translation trans = new Translation();
mapper.Map(translation, trans);
applicationDbContext.Translations.Add(trans); // Exception
Im Code Beispiel hole ich mir eine Language aus der Datenbank (Könnte auch eine neue erstellen, ist aber irrelevant) und mappe diese zu einem DTO.
Erstelle dann eine DTO Translation Entity (kommt bspw. von der UI) und würde dann im normalen Code die Navigation Property "Language" setzen und dann in der Datenbank erstellen.
Was ohne Mappen auch wunderbar funktioniert, mit Mapping erhalte ich diese Fehlermeldung:
Fehler |
The instance of entity type 'Language' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values. |
Hab dazu den Thread auf Stackoverflow gefunden und den Aufruf der Map Methode wie in der Antwort geändert. Hatte das genau so wie sein 1. Beispiel (aus der Antwort).
Hilft auch nicht.
Setze ich aber nur die ID anstatt die ganze Entity, funktionierts.
Ich finde aber zu dem Problem explizit auch keine Lösung, wie man das Mappen umstellen soll.
Man kann die Entity dann noch De/-Attachen aber ist dann auch wieder mehr Aufwand.
Hier ist einmal das Git Repo. Ist ein Test Projekt, was diesen Fehler produziert.
Als explizite Frage nochmal. Was genau mache ich falsch bzw. was muss ich ändern, dass die Fehlermeldung nicht mehr erscheint?