Linq to sql Linq到Sql更新中的ChangeConflictException
这件事让我很痛苦,如果有人能帮我,我会非常感激 我将DataContext附加到数据库上的单个测试表。试验表如下: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,
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使用的唯一更新行为。如果您的表上有时间戳列,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