使用LINQ进行简单编辑/更新操作。我的代码不是有点不对吗?

时间:2009-06-08 15:39:53

标签: sql linq linq-to-sql

考虑一个简单的编辑/更新代码:

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方法看起来不对?

1 个答案:

答案 0 :(得分:4)

这是Linq检查数据库并发性。您可以通过在列上设置此属性来抑制此行为:

[Column(... UpdateCheck=UpdateCheck.Never)]

此处有更多详情:http://msdn.microsoft.com/en-us/library/bb399373.aspx