2010-10-27 3 views
5

In meiner Anwendung habe ich eine Entität, die im Wesentlichen als ein Komplex viele zu viele zwischen meinem Benutzer und Projekt Entitäten verwendet wird. Ich versuche herauszufinden, ob meine Serviceebene die Entität dem Kontext hinzufügen oder die Entität anhängen muss (um eine vorhandene Entität zu aktualisieren) und ich weiß nicht, wie.Wie erkennen Sie, ob eine EF4-Entität ein neuer oder ein bestehender Datensatz ist?

Dies ist leicht zu bestimmen für die meisten meiner Entitäten wegen der Int Id-Feld, wenn es Null ist hat die Datenbank noch keinen Identitätswert gegeben. Dies ist nicht möglich, wenn es sich um einen zusammengesetzten Primärschlüssel handelt.

Hat jemand einen Vorschlag, wie man feststellen kann, ob eine Instanz einer Entität neu ist oder ein Update für einen bestehenden Datensatz?

Bearbeiten: Ich habe vergessen zu erwähnen, diese Entitäten sind POCOs für Code-zuerst gebaut, so dass ich keine EntityState-Eigenschaft für die Entität selbst haben.

+0

Added-Update, dass diese POCOs sind zu zeigen, nicht Standard EF Entitäten. – KallDrexx

+0

rate ich lese deinen Verstand, sehe meine Antwort. :) – RPM1984

Antwort

6

Ja, wie die oben genannten Antworten Zustand, überprüfen Sie die EntityState für die Einheit in der OSM.

Beachten Sie jedoch, dass dies nur für Entitäten funktioniert, die an den Kontext/Graphen angehängt sind.

Ich arbeite derzeit mit getrennten Entitäten (ASP.NET MVC), und da sie nicht an den Graphen angefügt sind, ist der EntityState unverändert.

In diesem Fall mache ich einen vorsorgenden Anruf an die DB, um die Entität mit dem Schlüssel zu greifen. Wenn nichts zurückgegeben wird, habe ich ein Add, sonst benutze ich applyCurrentValues ​​ die Werte außer Kraft zu setzen, dann tun .SaveChanges

Ich frage mich immer noch, ob dies der richtige Weg ist, aber ich dachte, es würde setzen dort draußen.

Ich verwende POCOs, die keine Änderungsverfolgung haben, daher muss ich ein bisschen mehr Arbeit erledigen.

Da es keine EntityState für die POCO ist, müssen Sie manuell in die OSM rufen:

var pocosInGraph = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified) 

Nachdem Sie Attach/hinzufügen, Ihre POCO in dieser Sammlung sein sollte.

Wie gesagt, wenn diese für eine MVC-Anwendung ist, werden Ihre Entitäten auf einem HTTP-POST getrennt und der EntityState bleibt daher unverändert.

In meinem Fall, ich manuell an die EntityState nach Anbringen:

ctx.Attach(poco); 
ctx.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified); 
ctx.SaveChanges(); 
+0

Danke dafür. Ich benutze auch ASP.NET MVC, also denke ich, mit der DB vor dem Anhängen oder Hinzufügen ist der Weg zu gehen. – KallDrexx

+0

Kühl. Ja, ich merkte, wenn ich vergessen habe, alle Eigenschaften in meiner Ansicht zu binden, sah dies als eine Flagge, um diese Werte zu "löschen", wenn ich das Formular absende. Ich denke, es ist sicherer, den Anruf zu tätigen (es ist sowieso ein effizienter Anruf). – RPM1984

2
if (x.EntityState == System.Data.EntityState.Added) 
//Add 
else if (x.EntityState == System.Data.EntityState.Modified) 
//Attach 

für weitere Informationen

http://msdn.microsoft.com/en-us/library/system.data.entitystate.aspx

+2

'EntityState' ist ein' FlagsAttribute'; es kann enthalten * hinzugefügt, ohne * gleich * zu sein. –

+0

Es scheint mir, dass FlagsAttribute nur für den Zweck der Suche mit GetObjectStateEntries eingeführt wurde. Wenn Sie versuchen, einen Multi-EntityState zuzuweisen, erhalten Sie InvalidOperationException: http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.changeobjectstate.aspx – surfen

Verwandte Themen