我正处在这个痛苦的世界里,如果有人可以提供帮助,我会非常感激.
我有一个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,我总是得到一个带有空ObjectChangeConflict.MemberConflicts集合的ChangeConflictException.这是使用的代码:
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执行自动乐观并发检查.