考虑一个简单的编辑/更新代码:
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 个数据库:
// 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 查询确保对象自上次查询以来没有改变,但实际上这在我们的上下文中是无用的。实际上,数据库可以在用户提交表单之前更改,我们的代码不会检测到任何问题。但是,如果 Foo 在我们在 Update 操作中读取之后但在 SubmitChanges 之前发生了更改,我们将收到 ChangeConflictException(这会造成混淆)。
为了使此类更新(检查原始数据库值)有意义,我们应该通过 HTTP 来回发送原始 Foo 对象。
public ActionResult Update(Foo original, Foo changed)
{
Foo foo = db.Foos.Attach(changed, original);
db.SubmitChanges();
}
在这种情况下,我们将在用户输入值时检测数据库中的变化。
但是如果我不关心并发变化,原来的 Update 方法是不是看起来不对?
最佳答案
这是 Linq 检查数据库并发性。您可以通过在列上设置此属性来抑制此行为:
[Column(... UpdateCheck=UpdateCheck.Never)]
此处有更多详细信息:http://msdn.microsoft.com/en-us/library/bb399373.aspx .
关于sql - 使用 LINQ 的简单编辑/更新操作。我的代码是不是有点错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965550/