Ich dürfte in einem Projekt endlich mal EF einsetzten. :-) Jetzt habe ich mir ein paar Tests gebaut um zu prüfen wie sich das Teil verhält mit Daten die ich dann nutzen möchte. Allerdings bin ich nicht wirklich zufrieden.
Zu erwähnen ist das ich STE (Self-Tracking Entities) nutze die über WCF mit dem Client ausgetauscht werden.
Das Laden mit allen Unterobjekten scheint kein Problem zu sein.
using (ProjectContainer db = new ProjectContainer(connectString)) { Project projekt = db.Project .Include("Produkt") .Include("Periode") .Include("Phase") .Include("Abteilung") .Include("Chance") .Where(t => t.ProjektID == projectId).FirstOrDefault();
return projekt; }
Aber das Speichern gefällt mir noch nicht. Irgend wie habe ich feststellen müssen das ein neu erstelltes Objekt anders gespeichert werden muss als eines das geladen wurde. Stimmt das? Bei mir dieht das Speichern so aus.
if (projekt.ProjektID == Guid.Empty) { //Neues Objekt using (ProjectContainer db = new ProjectContainer(connectString)) { db.Project.AddObject(projekt); db.SaveChanges(); } } else { //Bestehendes Objekt (geladen, verändert, speichern) using (ProjectContainer db = new ProjectContainer(connectString)) { db.Project.ApplyChanges(projekt);
Zwischen db.SaveChanges(); und db.SaveChanges(); ist ja jetzt nicht so ein großer Unterschied zu erkennen ;)
D.h. den Teil kann man ja am Ende zum Speichern auch einmalig ausführen. Insofern wird nicht anders gespeichert, sondern nur vorher anders mit den Objekten umgegangen.
Alles andere ist Code zum Hinzufügen oder Änderungen durchführen. Da brauchst du ja sowieso unterschiedlichen Code.
Es gibt im Context eine ObjectStateManager Property mit GetObjectStateEntry-Methode liefert eine EntityState Enumeration. Mit der kann man den Status eines Objekts feststellen, so dass du auch nicht auf die Abfrage einer Guid zwingend angewiesen bist.
Ja. Denn AddObject und ApplyChanges sind verschiedene Methoden.
Schau Dir mal dieses Beispielszenario an: http://msdn.microsoft.com/de-de/library/ee789839.aspx M.E. kannst Du .ADD oder .AddObject im Falle eines neuen (detachten) Objekts ausführen und den Rest, also ApplyChanges() und SaveChanges() grundsätzlich immer wenn du speichern möchtest. Dies ist in diesem Beispiel ebenfalls so gelöst.