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.

War es hilfreich?

Lösung

Versuchen Sie sich anzusehen ObjectStatemanager.tryGetObjectStateEntry -Methode, es ist gut beschrieben in Dieser Stackoverflow Queston.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top