Linq to sql Linq到Sql更新中的ChangeConflictException

Linq to sql Linq到Sql更新中的ChangeConflictException,linq-to-sql,Linq To Sql,这件事让我很痛苦,如果有人能帮我,我会非常感激 我将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,

这件事让我很痛苦,如果有人能帮我,我会非常感激

我将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,我可以从测试表中添加、检索和删除行,但我不能更新行——对于更新,我总是得到一个带有空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();
我正在群集SQL Server 2000(8.0.2039)上运行此查询。我一辈子都搞不清楚这里发生了什么。对数据库运行类似的更新查询似乎可以正常工作


提前感谢您的帮助。

行的任何数据是否可能在检索和尝试更新之间发生了更改?因为LINQ->SQL具有自动并发检查功能,将根据当前存储的值验证对象的内容(如生成的查询中所示)。如果数据库中的行与LINQ正在跟踪的对象之间的任何字段可能已更改,则更新将失败。如果发生这种情况,并且有充分的理由,并且您知道哪些字段,那么可以在DBML设计器中更新对象;选择原因字段并将“更新检查”属性更改为“从不”。

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

在Microsoft SQL Server Management Studio 2005中:

  • 右键单击服务器,然后单击属性
  • 在服务器属性窗口的左侧,选择连接页面
  • 在默认连接选项下,确保未选择“无计数”
  • 显然,LINQtoSQL在更新后使用@@ROWCOUNT发出自动乐观并发检查。当然,如果对整个服务器启用了“无计数”,则。@@ROWCOUNT始终返回零,并且LINQ to SQL在向数据库发出更新后抛出ConcurrencyException


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

    我在SQL Server 2008中也遇到同样的问题,并且连接选项
    无计数
    已被禁用


    我没有将
    更新检查
    属性更改为从不(正如Quintin所建议的那样),而是将其设置为WhenChanged,问题得到解决。

    首先记录有关问题的详细信息,哪些行和哪些字段冲突,哪些值冲突

    要实现此详细日志,请参见此处的“我的解决方案”:


    请发布您用于更新的代码我理解Linq to Sql在更新行时的乐观并发策略,但测试表中的任何行都绝对不可能被修改。有趣的是,当我向表中添加时间戳列时,我没有得到任何ConflictChangeException。谢谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。非常感谢。谢谢你,谢谢你,谢谢你!很好的调查,只是为了更正一点,Linq to SQL可能会使用从服务器返回的“count”值,但没有使用@ROWCOUNT,因为“即使在SET NOCOUNT处于启用状态时,@@ROWCOUNT函数也会更新。”
    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