需要将原始值与当前值进行比较,以便在保存更改之前对对象进行一些更新。如何获取对象的原始值?以下不起作用:
public ActionResult Edit(int id = 0)
{
Project project = db.Projects.Find(id);
...
db.Projects.Attach(project); // ATTACH here
...
}
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
db.Entry(project).State = EntityState.Modified; // The STATE was DETACHED here...
...
}
这是配置问题,还是我错过了什么?在此先感谢您的帮助!
答案 0 :(得分:1)
您的解决方案的问题是控制器的生命周期。 By default a new instance of the controller is generated for each client request。这意味着您需要在POST方法中加载原始值,因为您无法共享上下文的实例。
我在@ Gerard的评论
之后编辑了代码示例[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
var original_value = db.Projects.Find(project.ProjectId);
or
var original_value_detached = db.Projects.AsNoTracking().Where(P => P.ProjectId == project.ProjectId).FirstOrDefault();
}
}
或者您编写自己的控制器工厂实现以在两个请求之间共享上下文,但您应该考虑来自不同客户端的请求。您可以找到示例here
答案 1 :(得分:0)
看起来你正在实现并发。可能是,您可以尝试使用DbUpdateConcurrencyException
捕获更改。像这样:
try
{
...
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var dbValue = (Project)entry.GetDatabaseValues().ToObject();
if(dbValue.State == EntityState.Modified)
{
//***your code
}
}