2012-06-07 14 views
7

Ich habe eine kleine ASP.Net mvc3-Anwendung, und ich bin im Bearbeitungsteil. Ich habe die Standardvorlage:Wie auf alten Entity-Wert in ASP.NET Entity Framework zugreifen

public ActionResult Edit(int id) 
{ 
    User user = db.Users.Find(id); 
    return View(user); 
} 

public ActionResult Edit(User user) 
{ 
    //(Here access to old user name for example) 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 

Wenn ich user.name tun habe ich den neuen Wert, aber ich möchte, bevor das Speichern der db Wert zuzugreifen.

Danke!

+0

http://stackoverflow.com/editing-help#code – SLaks

Antwort

10

habe ich es mit einem kleinen Trick funktioniert.

db.Users.Attach(user); 
var current = db.Entry(user).CurrentValues.Clone(); 
db.Entry(user).Reload(); 
//Do you user(from db) stuff 
db.Entry(user).CurrentValues.SetValues(current); 
db.Entry(user).State = EntityState.Modified; 
db.SaveChanges(); 
+1

+1 schön gemacht. Ich habe nur einen Kommentar mit einem ähnlichen Vorschlag zu meinem vorherigen Beitrag hinzugefügt, als ich bemerkte, dass du ihn bereits gelöst hast. – lkaradashkov

+0

db.Entry (user) .GetDatabaseValues ​​() ist ein besserer Kandidat als CurrentValues, falls die Attribute im Code geändert wurden, nachdem sie aus der DB gezogen wurden. – Faiz

0

Wie wäre es damit:

public ActionResult Edit(User user) 
{ 
    User oldUser = db.Users.Find(user.id); 
    // oldUser object represents the user before the modification 
    ... 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

Leider habe ich das schon versucht, aber es gibt mir die Ausnahme: Ein Objekt mit dem gleichen Schlüssel existiert bereits im ObjectStateManager. Der ObjectStateManager kann mehrere Objekte mit demselben Schlüssel nicht verfolgen. – MaT

2

context.Entry (YourEntity) .GetDatabaseValues ​​() ToObject() als YourEntity

0

Hinzufügen auf die Antwort von lkaradashkov. Sie können versuchen, die Option AsNoTracking() zu verwenden, um zu verhindern, dass Entity Framework sie verfolgt.

public ActionResult Edit(User user) 
{ 
    User oldUser = db.Users.AsNoTracking().Single(x=>x.id.equals(user.id)); 
    // oldUser object represents the user before the modification 
    ... 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
0

Wenn Sie separaten alten und die neuen Wert erhalten mögen:

//user.UserName = "oldtest"  
user.UserName = "Test"  
var originalValues = db.Entry(user).OriginalValues.Clone(); 
var originalval = originalValues.GetValue<string>("UserName"); 
var currentvalue = db.Entry(user).CurrentValues.Clone(); 
var curretval = currentvalue.GetValue<string>("UserName"); 

Dies wird zurückkehren OriginalVal als Altwert vor setzen neuen Usernamen als „oldtest“ und curretval neue Benutzername zurück, wie „Test“

Verwandte Themen