7

我有一个小的 ASP.Net mvc3 应用程序,我正在编辑部分。我有默认模板:

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();
}

如果我做 user.name 我有新值,但我想在保存之前访问 db 值。

谢谢 !

4

5 回答 5

12

我用一个小技巧让它工作:

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();
于 2012-06-08T12:45:34.773 回答
2

context.Entry(YourEntity).GetDatabaseValues().ToObject() 作为 YourEntity

于 2015-09-26T22:42:19.213 回答
0

这个怎么样:

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();
}
于 2012-06-07T17:26:31.130 回答
0

添加到 lkaradashkov 的答案。您可以尝试使用选项 AsNoTracking() 来防止实体框架跟踪它。

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();
}
于 2017-01-12T19:32:38.573 回答
0

如果您想将旧值和新值分开:

 //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");

这将在将新用户名设置为“oldtest”之前将 originalval 作为旧值返回,并且 curretval 将新用户名返回为“Test”

于 2017-03-29T07:17:40.270 回答