Я нахожусь в мире боли с этим, и я был бы очень признателен, если бы кто-то мог помочь.
У меня есть 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, я могу добавлять, извлекать и удалять строки из тестовой таблицы, но не могу обновить строку - для ОБНОВЛЕНИЯ я всегда получаю ChangeConflictException с пустой коллекцией ObjectChangeConflict.MemberConflicts. Вот используемый код:
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 для БД, похоже, работает нормально.
Заранее спасибо за любую помощь.