2009-07-31 5 views
6

Может ли кто-нибудь сказать мне, если/как вы можете проверить изменения в контексте данных в Linq2Sql до, вызывающего SubmitChanges(). Ситуация у меня заключается в том, что я создаю контекст, выполняю несколько операций и добавляю много вставок вместе с другими задачами обработки, а затем откаты, если сбой невозможен.Подтвердить Linq2Sql перед SubmitChanges()

Что я хотел бы сделать, это сделать какой-то вызов «Validate()» после выполнения определенных задач, чтобы я мог обработать его перед отправкой всей работы.

ответ

6

Чтобы получить все изменения в контексте данных можно назвать

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

Что у меня есть каждый объект значение имеет метод проверки. Я использую attibutes для определения различных видов проверки. Причина, по которой я делаю это вручную, состоит в том, что у меня есть число, которое может быть int в базе данных и в коде, значение 1002 может быть недействительным, если я сохраню возраст. Поэтому я могу дать ряд значений и т. Д. ,

Если каждый из ваших объектов значений наследуется от базового объекта, он упрощает их итерацию. Предполагая, что у вас есть в базовом классе метод Validate.

Я хотел бы указать, что для этого вам нужно будет либо сгенерировать сгенерированный код, либо свернуть свои собственные объекты значений. Я, как правило, отказываюсь от своих собственных из-за того, как я использую их для проверки.

+0

никогда не замечал .GetChangeSet() метод раньше! Спасибо за это! +1 – StevenMcD

+0

Фактический подход, с которым я столкнулся, заключался в создании частичного класса с именем таблицы и внедрении кода проверки в OnFooChanging() для полей, которые я хотел проверить. Он работает, чтобы сразу бросать исключения, когда значение задано, а не в SubmitChanges(). Я не использовал ChangeSet, но он указал мне в правильном направлении и удобен в любом случае. –

+0

@Nick - я чувствую себя бесполезным, рассказывая вам об этом, потому что я не могу вспомнить блог, в котором я читал об этом, но, судя по всему, это хорошая идея сохранить независимость проверки от обработчиков OnChange, поскольку она позволяет создавать сложные сценарии проверки, где проверка одного свойства зависит от значения других и т. д. – Mark

5

Вы также можете использовать функцию OnValidate() с частичным классом LINQ-to-SQL Entity. OnValidate() будет вызываться во время SubmitChanges(), но перед отправкой данных в базу данных. Одна хорошая вещь с OnValidate() заключается в том, что вы можете различать действие CRUD посредством перечисления ChangeAction.

Например,

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
Смежные вопросы