gpt4 book ai didi

linq-to-sql - Linq 中的 ChangeConflictException 到 Sql 更新

转载 作者:行者123 更新时间:2023-12-03 19:55:54 25 4
gpt4 key购买 nike

我在这个痛苦的世界里,如果有人能提供帮助,我将不胜感激。

我有一个 DataContext 附加到数据库上的单个测试表。测试表如下:

CREATE TABLE [dbo].[LinqTests](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[StringValue] [varchar](255) NOT NULL,
[DateTimeValue] [datetime] NOT NULL,
[BooleanValue] [bit] NOT NULL,
CONSTRAINT [PK_LinqTests] PRIMARY KEY CLUSTERED ([ID] ASC))
ON [PRIMARY]

使用 Linq,我可以添加、检索和删除测试表中的行,但我无法更新行——对于 UPDATE,我总是得到一个 ChangeConflictException,其中包含一个空的 ObjectChangeConflict.MemberConflicts 集合。这是使用的代码:
var dataContext = new UniversityDataContext();
dataContext.Log = Console.Out;

for (int i = 1; i <= 1; i++) {
var linqTest = dataContext.LinqTests.Where(l => (l.ID == i)).FirstOrDefault();

if (null != linqTest) {
linqTest.StringValue += " I've been updated.";
}
else {
linqTest = new LinqTest {
BooleanValue = false,
DateTimeValue = DateTime.UtcNow,
StringValue = "I am in loop " + i + "."
};
dataContext.LinqTests.InsertOnSubmit(linqTest);
}
}

try {
dataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException exception) {
Console.WriteLine("Optimistic concurrency error.");
Console.WriteLine(exception.Message);
Console.ReadLine();
}

Console.ReadLine();

这是通过 DataContext 执行的更新的日志输出。
UPDATE [dbo].[LinqTests]
SET [StringValue] = @p3
WHERE ([ID] = @p0) AND ([StringValue] = @p1) AND ([DateTimeValue] = @p2) AND (NOT ([BooleanValue] = 1))
-- @p0: Input BigInt (Size = 0; Prec = 0; Scale = 0) [1]
-- @p1: Input VarChar (Size = 15; Prec = 0; Scale = 0) [I am in loop 1.]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [3/19/2009 7:54:26 PM]
-- @p3: Input VarChar (Size = 34; Prec = 0; Scale = 0) [I am in loop 1. I've been updated.]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.1

我在群集 SQL Server 2000 (8.0.2039) 上运行此查询。对于我的一生,我无法弄清楚这里发生了什么。对数据库运行类似的 UPDATE 查询似乎工作正常。

在此先感谢您的帮助。

最佳答案

我终于弄清楚这是怎么回事。显然,此服务器的“无计数”选项已打开。

在 Microsoft SQL Server Management Studio 2005 中:

  • 右键单击服务器,然后单击 属性
  • 在服务器属性窗口的左侧,选择 连接
  • 在默认连接选项下,确保未选择“无计数”。

  • 显然,LINQ to SQL 在更新后使用@@ROWCOUNT 来发出自动的乐观并发检查。当然,如果对整个服务器开启“无计数”,@@ROWCOUNT 总是返回零,LINQ to SQL 在向数据库发出更新后会抛出 ConcurrencyException。

    这不是 LINQ to SQL 使用的唯一更新行为。如果表上有 TIMESTAMP 列,LINQ to SQL 不会使用 @@ROWCOUNT 执行自动乐观并发检查。

    关于linq-to-sql - Linq 中的 ChangeConflictException 到 Sql 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663822/

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