Frage

Selbstverfolgungseinheiten. Genial.

Außer wenn Sie so etwas tun

return Db.Users;

Keines der selbst übertriebenen Einheiten verfolgt (bis sie möglicherweise deserialisiert sind).

Bußgeld. Wir müssen also erkennen, dass es die Möglichkeit gibt, dass ein Unternehmen, das zu uns zurückkehrt, keine Tracking ermöglicht.

Was jetzt???

Dinge, die ich ausprobiert habe

Für die angegebene Methode Körper:

using (var db = new Database())
{
    if (update.ChangeTracker.ChangeTrackingEnabled)
        db.Configurations.ApplyChanges(update);
    else
        FigureItOut(update, db);

    db.SaveChanges();
    update.AcceptChanges();
}

Die folgenden Implementierungen von FigureItOut Alle scheitern:

db.Configurations.Attach(update);
db.DetectChanges();

Noch

db.Configurations.Attach(update);
db.Configurations.ApplyCurrentValues(update);

Noch

db.Configurations.Attach(update);
db.Configurations.ApplyOriginalValues(update);

Noch

db.Configurations.Attach(update);
db.Configurations.ApplyChanges(update

Außerdem kann ich mir noch etwas anderes vorstellen, außer darauf zu werfen, als

  1. Holen Sie sich die ursprüngliche Entität aus der Datenbank
  2. Vergleich jeder Eigenschaft von Hand
  3. Aktualisieren von Eigenschaften nach Bedarf

Was genau soll ich mit selbst überträgenden Wesenheiten tun, die sich nicht selbst verfolgen?


Kleines Update:

Das Entität blind als modifizierte Werke zu markieren. Dies scheint jedoch ein bisschen stinkend zu sein. Ist es das Beste, was wir in diesem Fall tun können?

War es hilfreich?

Lösung

Szenario 1

Hier sind einige empfohlene Praktiken. Wenn Sie STE im WCF -Szenario verwenden, sollten Sie sich auf den Change Tracker verlassen, den SE impliziert, dass Sie Folgendes auf der Serverseite implementiert.

db.Users.ApplyChanges(user);
db.SaveChanges();

Szenario 2 jedoch, wenn Sie auf dem Server sind, besteht die empfohlene Praxis darin, eine Methode für die Teilklasse für ObjectContext namens EnablEchangAntracking zu erstellen. Die Methode würde nach Entitäten abfragen, die sich in einem unveränderten Zustand befinden, der iObjectWithangetracker implementiert, und das Verfolgen der Änderung so etwas einschaltet

user = db.users.first(u => u.userid == 1);
db.EnableChangeTracking();

Versuchen Sie nun, die Benutzerentität vor einem anderen Kontext zu retten, aus dem sie ursprünglich abgerufen wurde

db2.users.ApplyChanges(user);
db2.SaveChanges();

Szenario 3 Wenn Sie auf der Serverseite mit demselben Objektkontext verbunden sind, aus dem Sie die Benutzerentität abgerufen haben, verwenden Sie SE als einfaches PoCO -Objekt wie unten

user = db.users.first(u => u.userid == 1);
user.LastName = "XYZ";
db.DetectChanges(); //no need for it cuz Savechanges implicitly calls this.
db.SaveChanges();

Szenario 4 Wenn die Benutzereinheit aus einem anderen Kontext abgerufen wird, wird der Kontext, den Sie sparen, eine weitere Option, bei der Sie die Entität als geändert markieren und sich nicht darum kümmern, was geändert wurde.

user = db.users.first(u => u.userid == 1);
var db2 = new ObjectContext();
user.LastName = "XYZ";
db2.Users.Attach(user);
// i prefer this option..
db2.ObjectStateManager.ChangeObjectState(user,EntityState.Modified); 
db2.SaveChanges(); // updates all columns

Szenario 5 Wenn die Benutzereinheit aus einem anderen Kontext abgerufen wird, wird der Kontext u zum Speichern verwendet. Hier ist eine weitere Option, bei der Sie die ursprüngliche Entität abrufen.

user = db.users.first(u => u.userid == 1);
user.lastName ="XYZ";
var db2 = new ObjectContext();
db2.Users.First(u => u.userid == user.userid);
db2.users.ApplyCurrentValues(user);
db2.SaveChanges();

Hier ist ein Blog -Beitrag, der einige Szenarien beschreibt.http://weblogs.asp.net/zeeshanhirani/archive/2010/03/30/modifying-s self-tracking-entity-on-the-server.aspx

Ich behandle diese Konzepte in meinem Entity Framework 4.0 -Rezepte Buch mit vielen Szenarien.

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