实体框架中的审计

时间:2009-09-03 17:43:26

标签: linq entity-framework ado.net

在浏览实体框架后,我有一些关于在实体框架中实施审核的问题。

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

  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
        }
    }
    

2 个答案:

答案 0 :(得分:1)

这里有两个基本选项:

  • 在数据库级别执行
  • 在c#code
  • 中执行

在数据库级别执行此操作意味着使用触发器。在这种情况下,如果您使用的是企业库或其他数据访问技术,则没有区别。

要在C#代码中执行此操作,您需要在数据模型中添加日志表,并将更改写入日志表。当您执行保存更改时,将保存对数据的更改以及写入日志表的信息。

答案 1 :(得分:0)

您是否使用存储过程插入新记录?如果没有(即你正在新建一个对象,设置值,插入提交然后保存更改,新对象ID将自动加载到您创建的对象的id属性中。如果您使用存储过程执行插入操作那么你需要从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;
}