Ответственность разработчика при переопределении поведения по умолчанию

LINQ to SQL не применяет следующие требования, но поведение не определено, если эти требования не выполнены.

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

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

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

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

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

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

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

См. также