linq-to-sql – 将Linq中的ChangeConflictException异常更新为Sql

前端之家收集整理的这篇文章主要介绍了linq-to-sql – 将Linq中的ChangeConflictException异常更新为Sql前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正处于一个痛苦的世界,如果有人可以帮助,我会非常感激。

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

  1. CREATE TABLE [dbo].[LinqTests](
  2. [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))
  3. ON [PRIMARY]

使用Linq,我可以添加,检索和删除测试表中的行,但是我无法更新一行 – 对于UPDATE,我总是得到一个带有一个空的ObjectChangeConflict.MemberConflicts集合的ChangeConflictException。以下是使用的代码

  1. var dataContext = new UniversityDataContext();
  2. dataContext.Log = Console.Out;
  3.  
  4. for (int i = 1; i <= 1; i++) {
  5. var linqTest = dataContext.LinqTests.Where(l => (l.ID == i)).FirstOrDefault();
  6.  
  7. if (null != linqTest) {
  8. linqTest.StringValue += " I've been updated.";
  9. }
  10. else {
  11. linqTest = new LinqTest {
  12. BooleanValue = false,DateTimeValue = DateTime.UtcNow,StringValue = "I am in loop " + i + "."
  13. };
  14. dataContext.LinqTests.InsertOnSubmit(linqTest);
  15. }
  16. }
  17.  
  18. try {
  19. dataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
  20. }
  21. catch (ChangeConflictException exception) {
  22. Console.WriteLine("Optimistic concurrency error.");
  23. Console.WriteLine(exception.Message);
  24. Console.ReadLine();
  25. }
  26.  
  27. Console.ReadLine();

以下是通过DataContext执行的更新的日志输出

  1. UPDATE [dbo].[LinqTests]
  2. SET [StringValue] = @p3
  3. WHERE ([ID] = @p0) AND ([StringValue] = @p1) AND ([DateTimeValue] = @p2) AND (NOT ([BooleanValue] = 1))
  4. -- @p0: Input BigInt (Size = 0; Prec = 0; Scale = 0) [1]
  5. -- @p1: Input VarChar (Size = 15; Prec = 0; Scale = 0) [I am in loop 1.]
  6. -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [3/19/2009 7:54:26 PM]
  7. -- @p3: Input VarChar (Size = 34; Prec = 0; Scale = 0) [I am in loop 1. I've been updated.]
  8. -- Context: sqlProvider(sql2000) Model: AttributedMetaModel Build: 3.5.30729.1

我在集群sql Server 2000上运行此查询(8.0.2039)。在我的生活中,我不能弄清楚这里发生了什么。对DB运行类似的UPDATE查询似乎工作正常。

提前感谢任何帮助。

解决方法

我终于知道发生了什么事情。显然,此服务器已启用“无计数”选项。

在Microsoft sql Server Management Studio 2005中:

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

显然,LINQ to sql在更新后使用@@ ROWCOUNT来发布自动化的乐观并发检查。当然,如果为整个服务器启用“不计数”,@@ ROWCOUNT总是返回零,LINQ to sql会在发出数据库更新后引发ConcurrencyException。

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

猜你在找的MsSQL相关文章