考虑一个简单的编辑/更新代码:
public ActionResult Edit(int id)
{
return View(db.Foos.Single(x => x.Id == id));
}
public ActionResult Update(Foo changed)
{
Foo foo = db.Foos.Single(x => x.Id == changed.Id);
foo.P1 = changed.P1;
db.SubmitChanges();
}
我在这里尝试做的是发送:
UPDATE [dbo].[Foos]
SET [P1] = @p1
WHERE ([Id] = @p0)
但实际上我们最终得到了2个db调用:
// Read current db object
SELECT [t0].[Id], [t0].[P1]
FROM [dbo].[Foos] AS [t0]
WHERE [t0].[Id] = @p0
// Submit changes
UPDATE [dbo].[Foos]
SET [P1] = @p2
WHERE ([Id] = @p0) AND ([P1] = @p1)
UPDATE查询确保自上次查询后对象没有更改,但实际上这在我们的上下文中是无用的。实际上,在用户提交表单之前可以更改db,我们的代码不会检测到任何问题。但是如果在我们在Update操作中读取它之后更改了Foo,但在SubmitChanges之前,我们将收到ChangeConflictException(这会让人感到困惑)。
对于这样的更新(检查原始数据库值),我们应该通过HTTP向前和向后发送原始Foo对象。
public ActionResult Update(Foo original, Foo changed)
{
Foo foo = db.Foos.Attach(changed, original);
db.SubmitChanges();
}
在这种情况下,我们将在用户输入值时检测db中的更改。
但是如果我不关心并发更改,是不是原始的Update方法看起来不对?
答案 0 :(得分:4)
这是Linq检查数据库并发性。您可以通过在列上设置此属性来抑制此行为:
[Column(... UpdateCheck=UpdateCheck.Never)]
此处有更多详情:http://msdn.microsoft.com/en-us/library/bb399373.aspx。