Я пытаюсь реализовать аудит базы данных в 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 'вся необходимая информация.
Я не уверен, как извлечь таблицу БД, обновляемую, вставляемую или удаляемую из нее, обновляемое имя поля (не относится, конечно, к вставкам и удалениям)и как именно получить исходные и измененные данные ТОЛЬКО из полей, которые были изменены.Можно ли получить доступ к базовому отображению, чтобы узнать, к какой таблице базы данных относится объект в коде?
Если я смогу отсортировать это, то это приведет к моей другой большой проблеме.Большинство наших полей первичного ключа в базе данных представляют собой целые числа следующего ряда, сгенерированные базой данных (поля идентификаторов).Мне нужно записать это значение для всех вставок, но я понятия не имею, как мне этого добиться!Очевидно, что это значение не будет существовать при создании объектов аудита.
Любые советы, примеры кода или ресурсы будут очень полезны.Конечно, я не единственный, кто пытался это сделать.
Я могу предоставить исходный код, но я не хотел загромождать этот первоначальный пост.
С уважением
Стивен