2009-09-03 58 views
1

通过实体框架后,我有几个关于在实体框架中实施审计的问题。实体框架中的审计

我想将每个创建或更新的列值存储到不同的审计表中。

  1. 现在我调用SaveChanges(false)来保存数据库中的记录(仍然没有重置上下文中的更改)。然后获取添加|修改记录并通过GetObjectStateEntries循环。但不知道如何获取存储过程填充其值的列的值。即创建,修改等。

  2. 下面是我正在处理的示例代码。

    // Get the changed entires(ie, records) 
    IEnumerable<ObjectStateEntry> changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
    
    // Iterate each ObjectStateEntry(for each record in the update/modified collection) 
    foreach (ObjectStateEntry entry in changes) 
    { 
        // Iterate the columns in each record and get thier old and new value respectively 
        foreach (var columnName in entry.GetModifiedProperties()) 
        { 
         string oldValue = entry.OriginalValues[columnName].ToString(); 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, oldvalue, newvalue 
        } 
    } 
    
    changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
    
    foreach (ObjectStateEntry entry in changes) 
    { 
        if (entry.IsRelationship) continue; 
        var columnNames = (from p in entry.EntitySet.ElementType.Members 
             select p.Name).ToList(); 
    
        foreach (var columnName in columnNames) 
        { 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, value 
        } 
    } 
    
+0

这不是很清楚你想做的事,你你正在寻找这里 - 究竟做什么不知道该怎么办? – 2009-09-03 18:38:46

+0

我想做审计(当对给定实体进行任何更改时,在审计表中插入表名/实体名,列名,值) – 2009-09-03 19:19:29

回答

1

这里有两种基本的选择:

  • 在数据库级别做吧
  • 做它在C#代码

在数据的基础上做它级别,意味着使用触发器。在这种情况下,如果您正在使用企业库或其他数据访问技术,则没有区别。

要在C#代码中执行此操作,您需要向数据模型添加日志表,然后将更改写入日志表。当您进行保存更改时,数据的更改和您写入日志表的信息都将被保存。

0

您是否使用存储过程插入新记录?如果没有(例如,你正在创建一个对象,设置值,插入提交然后保存更改,新的对象id将自动加载到你创建的对象的id属性中。如果你正在使用存储的proc来插入那么你需要从PROC作为返回值返回@@ IDENTITY

EX:

StoreDateContext db = new StoreDataContext(connString); 
Product p = new Product(); 
p.Name = "Hello Kitty Back Scratcher"; 
p.CategoryId = 5; 
db.Products.Add(p); 
try 
{ 
    db.SaveChanges(); 
    //p.Id is now set 
    return p.Id; 
} 
finally 
{ 
    db.Dispose; 
}