LinqToSQL и аудит изменили поля - PullRequest
2 голосов
/ 03 мая 2009

Вот еще один из этих вопросов LinqToSQL, где я уверен, что я где-то пропустил лодку, потому что поведение дизайнера O / R очень меня озадачивает ...

У меня есть базовый класс для моих таблиц LinqToSQL, который я назвал LinqedTable. Я успешно использовал рефлексию, чтобы овладеть всеми свойствами классов-потомков и сделать другие стандартные вещи.

Теперь я хочу провести некоторый автоматический аудит моих таблиц, чтобы при вставке или удалении записи LinqedTable или изменении значения поля я вставлял запись в таблицу аудита с подробным описанием типа изменения, имя поля и его значение до и после сохранения.

Я думал, что смогу сделать это, используя событие PropertyChanging, отслеживая все измененные свойства перед сохранением, а затем очищая коллекцию изменений после каждого вызова SubmitChanges(). Но - сгенерированный код от дизайнера O / R по какой-то странной причине не дает вам имя свойства в событии PropertyChanging - он отправляет пустую строку! ( ПОЧЕМУ?! ) отправляет имя свойства в событии PropertyChanged, но уже слишком поздно для получения исходного значения.

Я решил собрать все исходные значения всех свойств, используя частичный метод OnLoaded(), но по определению он является частным, и мне нужен доступ к этому методу в базовом классе. Даже если бы я использовал рефлексию, чтобы овладеть этим методом, это означало бы, что мне пришлось бы реализовать вторую половину частичного метода для каждой из моих таблиц, что в некотором роде противоречит цели получения наследства!

Я также не могу найти подходящий метод в DataContext для использования или переопределения.

Так что бы вы порекомендовали, чтобы эта функция аудита работала?

Ответы [ 2 ]

7 голосов
/ 03 мая 2009

Вы можете использовать GetChangeSet для DataContext, чтобы получить список обновлений, вставок и удалений, которые произошли во всех таблицах в контексте. Вы можете использовать ITable.GetOriginalEntityState, чтобы получить исходные значения измененного объекта. Однако при извлечении исходных значений удаленной или обновленной записи связи не будут доступны, поэтому вам придется полагаться на значения внешнего ключа только в этой области, если вам нужно обработать связанные объекты. Вы можете использовать ITable.GetModifiedMembers для извлечения только тех значений, которые были изменены.

0 голосов
/ 03 мая 2009

Простите за, возможно, глупый ответ, но как насчет проведения аудита непосредственно в SQL Server с использованием триггеров (если вы в стандарте SQL Server 2005 или 2008) или с помощью средств отслеживания изменений в SQL Server 2008 Enterprise?

...