Обязанности разработчика при переопределении поведения по умолчанию (LINQ to SQL)

Представленные ниже требования не являются обязательными в LINQ to SQL, однако, если их не выполнить, поведение будет неопределенным.

  • Метод переопределения не должен вызывать методы SubmitChanges и Attach. Если эти методы вызываются в методе переопределения, LINQ to SQL создает исключение.

  • Методы переопределения нельзя использовать для начала, фиксации или остановки транзакции. Операция SubmitChanges выполняется в составе транзакции. Внутренняя вложенная транзакция может помешать выполнения внешней транзакции. Методы переопределения загрузки могут начать транзакцию, лишь определив, что операция не выполняется в рамках Transaction.

  • Ожидается, что методы переопределения соответствуют применимому сопоставлению оптимистического параллелизма. Ожидается, что при возникновении конфликта оптимистичного параллелизма метод переопределения вызывает исключение ChangeConflictException. LINQ to SQL перехватывает это исключение, давая разработчику возможность правильно обработать параметр SubmitChanges, переданный методу SubmitChanges.

  • Ожидается, что методы переопределения операций создания (Insert) и обновления (Update) отправляют значения созданных базой данных столбцов обратно соответствующим членам объекта при успешном завершении операции.

    Например, если член Order.OrderID сопоставлен столбцу идентификаций (первичный ключ с автоувеличением), тогда метод переопределения InsertOrder() должен извлекать созданный базой данных код и устанавливать для члена Order.OrderID значение этого кода. Аналогичным образом, чтобы гарантировать согласованность обновленных объектов, члены отметок времени должны обновляться значениями отметок времени, созданными базой данных. Если не распространить созданные базой данных значения на члены, может возникнуть несогласованность между базой данных и объектами, отслеживаемыми классом DataContext.

  • Пользователь обязан вызвать правильный динамический API-интерфейс. Например, в методе переопределения обновления может быть вызван только метод ExecuteDynamicUpdate. LINQ to SQL не обнаруживает и не проверяет вызванный динамический метод на предмет соответствия применяемой операции. Если вызывается неприменимый метод (например, метод ExecuteDynamicDelete для обновления объекта), результаты не определены.

  • Наконец, ожидается, что метод переопределения выполняет объявленную операцию. Семантика таких операций LINQ to SQL, как активная загрузка, отложенная загрузка и SubmitChanges, требует, чтобы переопределения предоставляли объявленные службы. Например, переопределение загрузки, которое лишь возвращает пустую коллекцию без проверки содержимого в базе данных, скорее всего, приведет к несогласованности данных.

См. также

Другие ресурсы

Настройка операций вставки, обновления и удаления (LINQ to SQL)