gpt4 book ai didi

asp.net-mvc - 在编辑操作中使用 RowVersion 的 ASP.NET MVC 并发

转载 作者:行者123 更新时间:2023-12-04 19:44:23 25 4
gpt4 key购买 nike

我想为我们的问题跟踪应用程序做一个简单的编辑表单。为简单起见,HttpGet Edit 操作看起来像这样:

    // Issues/Edit/12
public ActionResult Edit(int id)
{
var thisIssue = edmx.Issues.First(i => i.IssueID == id);
return View(thisIssue);
}

然后 HttpPost 操作看起来像这样:

    [HttpPost]
public ActionResult Edit(int id, FormCollection form)
{
// this is the dumb part where I grab the object before I update it.
// concurrency is sidestepped here.
var thisIssue = edmx.Issues.Single(c => c.IssueID == id);

TryUpdateModel(thisIssue);
if (ModelState.IsValid)
{
edmx.SaveChanges();

TempData["message"] = string.Format("Issue #{0} successfully modified.", id);
return RedirectToAction("Index");
}

return View(thisIssue);
}

效果非常好。但是,并发检查不起作用,因为在 Post 中,我在尝试更新它之前重新检索当前实体。但是,对于 EF,我不知道如何使用 SaveChanges() 的奇特之处,而是将我的 thisIssue 附加到上下文中。我试着调用 edmx.Issues.Attach(thisIssue) 但我得到了

The object cannot be attached because it is already in the object context. An object can only be reattached when it is in an unchanged state.

如何使用 EF 处理 MVC 中的并发和/或如何正确附加我编辑的对象到上下文?

提前致谢

最佳答案

您正在做的事情很棘手,但可以让它发挥作用。假设您的时间戳字段称为 ConcurrencyToken .显然,您必须在 View 中包含此值并与您的表单一起提交。但是您不能简单地将其分配给 thisIssue.ConcurrencyToken 的值。在 POST 中,因为 EF 会记住“旧”值(您通过调用 Single() 从数据库中获取的值)以及"new"值(来自您的表单),并在WHERE 子句。因此您需要对 EF 撒谎并分配正确的值。试试这个:

    var thisIssue = edmx.Issues.Single(c => c.IssueID == id);
TryUpdateModel(thisIssue); // assign ConcurrencyToken
var ose = Context.ObjectStateManager.GetObjectStateEntry(entityToUpdate);
ose.AcceptChanges(); // pretend object is unchanged
TryUpdateModel(thisIssue); // assign rest of properties

您可以通过仅绑定(bind) ConcurrencyToken 来优化它而不是调用 TryUpdateModel两次,但这应该可以帮助您入门。

关于asp.net-mvc - 在编辑操作中使用 RowVersion 的 ASP.NET MVC 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2775450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com