我正在尝试在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个单独的表组成,因此我创建了一个“视图”并将其导入到我的模型中。然后,我编写了一个匹配的存储过程来更新审计表,并将函数映射到我的“审计”视图以进行插入。我们的想法是从对象状态管理器中的数据创建审计对象,并将它们添加到上下文中,以便它们都在“SaveChanges”方法中更新。
我的审核实体如下所示:
1. [AuditID]
2. [AuditTableName]
3. [FieldName]
4. [ChangedFrom]
5. [ChangedTo]
6. [LinkedID]
7. [DateTimeModified]
8. [Username]
9. [ActionID]
我有两个问题。我很难从' ObjectStateEntities '中提取所有必需的信息。
我不确定如何提取正在更新,插入或删除的数据库表,正在更新的字段名称(当然与插入和删除无关),以及如何获取仅限原始数据和已修改数据已修改的字段。是否可以访问底层映射以找出实体在代码中映射到哪个数据库表?
如果我可以对它进行排序,那么它将导致我的另一个大问题。我们数据库中的大多数主键字段是由数据库生成的整数“后续”数字(标识字段)。我需要记录所有插入的值,但我不知道如何实现这一点!显然,当我创建审计实体时,这个值将不存在。
任何建议,代码示例或资源都会受到极大的欢迎。当然,我不是唯一一个尝试过此事的人。
我可以提供源代码,但我不想混淆这个初始帖子。
亲切的问候
斯蒂芬