Аудит изменений в базе данных в SaveChanges () в Entity Framework 4.0 - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь реализовать аудит базы данных в Entity Framework 4.0.Я искал в сети и нашел несколько полезных постов, которые помогли мне начать работу (http://blog.pragmasql.com/post/Entity-Framework-4-(EF4)-Adventures.aspx). Я написал служебный класс с именем «ContextWithAuditing», этот класс обрабатывает « SavingChanges »).'событие. Я вызываю этот метод из моего конструктора контекстов, передаваемого сам по себе (код добавлен через шаблон T4).

public ChinookEntities()
        : base(ConnectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        new ContextWithAudit(this);
    }

Затем я выполняю следующий код в обработчике события:

var AuditList = new List<Audit>();
        // query the ObjectStateManager (change tracking) and get the Inserted, Updated and Deleted entities
        foreach (var item in _context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | 
                                                                              EntityState.Modified | 
                                                                              EntityState.Deleted))

Таблицы аудита в базе данных состоят из 3 отдельных таблиц, поэтому я создал одно «представление» и импортировал его в свою модель. Затем я написал соответствующую хранимую процедуру для обновления таблиц аудита и отображения функции в мою ».Audit 'view для вставок. Идея состоит в том, чтобы создать объекты аудита из данных в менеджере состояний объектов и добавить их в контекст, чтобы они все обновлялись в методе' SaveChanges '.

Мой объект аудита выглядит следующим образом:

1. [AuditID]
2. [AuditTableName]
3. [FieldName]
4. [ChangedFrom]
5. [ChangedTo]
6. [LinkedID]
7. [DateTimeModified]
8. [Username]
9. [ActionID]

У меня две проблемы. Я пытаюсь извлечь из ' ObjectStateEntities 'вся необходимая информация.

Я не уверен, как извлечь таблицу БД, обновляемую, вставляемую или удаляемую из нее, обновляемое имя поля (не относится, конечно, к вставкам и удалениям)и как именно получить исходные и измененные данные ТОЛЬКО из полей, которые были изменены.Можно ли получить доступ к базовому отображению, чтобы узнать, к какой таблице базы данных относится объект в коде?

Если я смогу отсортировать это, то это приведет к моей другой большой проблеме.Большинство наших полей первичного ключа в базе данных представляют собой целые числа следующего ряда, сгенерированные базой данных (поля идентификаторов).Мне нужно записать это значение для всех вставок, но я понятия не имею, как мне этого добиться!Очевидно, что это значение не будет существовать при создании объектов аудита.

Любые советы, примеры кода или ресурсы будут очень полезны.Конечно, я не единственный, кто пытался это сделать.

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

С уважением

Стивен

...