myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Warum wirft EF Core mit gemappten Entitäten eine "is already being tracked." Exception?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum wirft EF Core mit gemappten Entitäten eine "is already being tracked." Exception?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 109
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster


Duesmannr ist offline

Warum wirft EF Core mit gemappten Entitäten eine "is already being tracked." Exception?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: <eig. MySQL>

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.

C#-Code:
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:

Fehlermeldung:
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?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Duesmannr am 23.10.2020 19:53.

21.10.2020 21:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Duesmannr Duesmannr ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.04.2017
Beiträge: 109
Entwicklungsumgebung: Visual Studio 2017/19
Herkunft: Münster

Themenstarter Thema begonnen von Duesmannr

Duesmannr ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Moin,

wenn man keine Antworten erhält, versteht man entweder das Problem/die Frage nicht oder weiß keine Lösung.
Ersteres weiß ich nicht, wie ich es noch besser Beschreiben soll, weil ich mMn sehr viele Informationen liefere mit einem Git Repo, worin man das Problem reproduzieren kann.

Aber wer auch immer den Titel geändert hat, hat das Problem nicht verstanden.
Der Mapper wirft keine Exception, sondern EF Core beim Hinzufügen der Entity zum DbSet.

Hoffe trotzdem, dass jemanden evtl. was einfällt, weil mir tut es nicht, obwohl ich mich bis dato immer noch damit beschäftige.

Grüße
23.10.2020 19:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
teebeast teebeast ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.12.2010
Beiträge: 38
Entwicklungsumgebung: Visual Studio 2019
Herkunft: Bayern


teebeast ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

So wie es ausschaut, hast Du ja das Objekt language aus der Datenbank (DataContext) geladen. Was im Mapper passiert, ist nicht transparent. Aber Du solltest Deinem translation-Objekt language und nicht mappedLanguage zuweisen. Die werden die identische Id haben und daher kommt die Meldung.

Normalerweise reicht es, die Id einer Referenz zuzuweisen und zu speichern, sofern der DataContext nur für den Zeitraum des Speicherns lebt. Wenn Du den DataContext länger leben lässt - wegen Caching oder ähnlichem - dann kommt man ggf. nicht drum herum auch die Referenz zu setzen. Ich persönlich vermeide es auf DataContext-Ebene zu cachen oder unnötig langlebig zu halten.

Auch verstehe ich nicht, warum die Language gemappt wird. Normalerweise sollte sich doch an dem Objekt in dem Kontext nichts ändern dürfen, oder doch? Die Frage wäre, ob dann die Language nicht ihre eigene Speichermethode bekommt.
24.10.2020 11:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.572
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Duesmannr:
Aber wer auch immer den Titel geändert hat, hat das Problem nicht verstanden.

Du kannst den Titel jederzeit selbst anpassen. Dazu gibt es den Editieren-Button :)

Das Problem selbst hat nichts mit dem AutoMapper zu tun. Der AutoMapper setzt nur Eigenschaftswerte entsprechend deiner Konfiguration.

Das Problem würde genauso auftreten, wenn du die Objekte manuell mappst und die einzelnen Werte per Hand setzt.
26.10.2020 12:43 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 05.12.2020 23:17