sql - 使用 LINQ 的简单编辑/更新操作。我的代码是不是有点错误?

标签 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 个数据库:

// 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/

相关文章:

c# - Linq 查询加入显示错误

c# - LINQ外连接动态OrderBy

sql - 从 View 中插入临时表非常慢

sql - Android上的SQLite:仅从datetime选择时间

mysql - SQL选择2个表

sql - 如何在 Presto 的 varchar 字段数组中搜索文本?

c# - LINQ - 使用 OrderBy 和 GroupBy 的子查询

c# - 将成员从类列表复制到 C# 中的字符串列表

linq - 通过 WCF 服务公开 IQueryable

c# - LINQ 查询中多列的总和