【发布时间】:2009-03-19 20:03:29
【问题描述】:
我为此感到痛苦,如果有人能提供帮助,我将不胜感激。
我有一个 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 查询似乎可以正常工作。
提前感谢您的帮助。
【问题讨论】:
-
请发布您用于更新的代码
标签: linq-to-sql