在浏览实体框架后,我有一些关于在实体框架中实施审核的问题。
我想将创建或更新的每个列值存储到不同的审计表中。
现在我调用SaveChanges(false)来保存数据库中的记录(仍未重置上下文中的更改)。然后得到添加的|修改记录并循环遍历GetObjectStateEntries。但是不知道如何获取存储过程填充其值的列的值。即,创建,修改日期等。
以下是我正在处理的示例代码。
// 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 :(得分:1)
这里有两个基本选项:
在数据库级别执行此操作意味着使用触发器。在这种情况下,如果您使用的是企业库或其他数据访问技术,则没有区别。
要在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;
}