Bestimmen Sie effizient, ob EF 4 POCO bereits in ObjectSet
-
24-10-2019 - |
Frage
Ich versuche EF 4 mit Poco's bei einem kleinen Projekt zum ersten Mal. In meiner Repository-Implementierung möchte ich ein Methode AddorUpdate bereitstellen, das dem Repository einen POCO hinzufügt, wenn es neu ist, sonst nichts (wie der aktualisierte PoCO wird gespeichert, wenn Savechanges aufgerufen wird).
Mein erster Gedanke war, dies zu tun:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
Dies führt jedoch zu a NotSupportedException
wie unter dokumentiert Referenzierung auf nicht-scalare Variablen, die nicht unterstützt werden (Bonusfrage: Warum sollte das nicht unterstützt werden?)
Einfach das entfernen Contains
Teil und immer addObject -resultierende Ergebnisse zu einer InvalidStateException
:
Ein Objekt mit demselben Schlüssel ist bereits im ObjectStatemanager vorhanden. Das vorhandene Objekt befindet sich im unveränderten Zustand. Ein Objekt kann dem ObjectStatemanager nur erneut hinzugefügt werden, wenn es sich im hinzugefügten Zustand befindet.
So deutlich weiß EF 4 irgendwo, dass dies ein Duplikat basiert, der auf dem Schlüssel basiert.
Was ist für das Repository eine saubere und effiziente Möglichkeit, POCOs entweder für ein neues oder bereits bestehendes Objekt zu aktualisieren, wenn Addorupdate aufgerufen wird, damit der nachfolgende Anruf bei Savechanges () das Richtige tut?
Ich habe in Betracht gezogen, eine ISNew -Flagge auf das Objekt selbst zu tragen, aber ich versuche, die Ausdauer von Unwissenheit für praktisch zu nehmen.
Lösung
Versuchen Sie sich anzusehen ObjectStatemanager.tryGetObjectStateEntry -Methode, es ist gut beschrieben in Dieser Stackoverflow Queston.