Я пытаюсь установить Linq на Sql в дизайн N-уровня. Я реализую параллелизм, предоставляя исходные значения при прикреплении объектов к контексту данных. При вызове SubmitChanges и наблюдении сгенерированных скриптов в профилировщике sql-сервера я вижу, что они генерируются должным образом. Они включают в себя предложения, которые проверяют все свойства объекта (все они отмечены UpdateCheck.Always).Linq to Sql: ChangeConflictException не выбрасывается (и никакие строки не обновлены/удалены)
Результат такой, как ожидалось, то есть ни одна строка не обновляется при обновлении или не удаляется при удалении. Но я не получаю никаких исключений. Разве это не должно бросать исключение ChangeConflictException?
Для ясности здесь есть дизайн и поток для тестов, в которых я запускаю: у меня есть клиентская консоль и консоль обслуживания, которые разговаривают друг с другом через WCF, используя WsHttpBinding.
- Клиент запрашивает данные от службы
- Service инстанцирует DataContext, извлекает данные, избавляется контекст, возвращает данные клиенту.
- Клиент вносит изменения в возвращаемые данные.
- Клиент запрашивает обновление измененных данных из службы.
5a. Служба создает экземпляр datacontext, прикрепляет объекты и ...
5b. Я приостанавливаю выполнение и изменяю значения в базе данных, чтобы вызвать конфликт изменений
5c. Сервисные вызовы SubmitChanges.
Вот код для шага 5, почистил немного для ясности:
public void UpdateEntities(ReadOnlyChangeSet<Entity> changeSet)
{
using (EntityDataContext context = new EntityDataContext())
{
if (changeSet.AddedEntities.Count > 0)
{
context.Entities.InsertAllOnSubmit(changeSet.AddedEntities);
}
if (changeSet.RemovedEntities.Count > 0)
{
context.Entities.AttachAll(changeSet.RemovedEntities, false);
context.Entities.DeleteAllOnSubmit(changeSet.RemovedEntities);
}
if (changeSet.ModifiedRecords.Count > 0)
{
foreach (var record in changeSet.ModifiedRecords)
{
context.Entities.Attach(record.Current, record.Original);
}
}
// This is where I pause execution and make changes to the database
context.SubmitChanges();
}
}
Я использую некоторые классы для отслеживания изменений и сохранить оригиналы, как вы можете видеть.
Любая помощь приветствуется.
EDIT: У меня нет проблем со вставками. Я только включил код, который вызывает InsertAllOnSubmit для полноты.