【发布时间】:2018-05-15 11:32:24
【问题描述】:
我查看了许多使用实体框架创建审计跟踪的示例,但尚未找到适合我的任何内容。通过简单地覆盖数据库上下文中的 SaveChanges 并使用 ChangeTracker 必须有一种巧妙/简洁的方法来做到这一点......我遇到的问题是诸如添加(创建)一个实体时它直到之后才具有 ID你保存它,当你保存它时,它似乎会爆炸更改跟踪器中的内容。无论如何,我有一个审计跟踪工作,但它很丑陋,我正在寻求帮助来简化它并使其不必每次添加实体时都添加一个可怕的 if-then !任何和所有帮助表示赞赏。
public bool CreateRecord(object o)
{
Audit audit = new Audit()
{
ChangeTypeID = (int)Audit.ChangeType.CREATE,
TimeStamp = GetCurrentDateTime(),
RecordClass = o.GetType().ToString(),
NewValue = "",
ReasonForChange = "Record Creation"
};
if (o.GetType() == typeof(Permission))
{
Permission x = (Permission)o;
audit.OriginalValue = x.ToString();
Permissions.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(User))
{
User x = (User)o;
audit.OriginalValue = x.ToString();
Users.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(LogIn))
{
LogIn x = (LogIn)o;
audit.OriginalValue = x.ToString();
LogIns.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Marker))
{
Marker x = (Marker)o;
audit.OriginalValue = x.ToString();
Markers.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Method))
{
Method x = (Method)o;
audit.OriginalValue = x.ToString();
Methods.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Sample))
{
Sample x = (Sample)o;
audit.OriginalValue = x.ToString();
Samples.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Run))
{
Run x = (Run)o;
audit.OriginalValue = x.ToString();
Runs.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(XYDataSet))
{
XYDataSet x = (XYDataSet)o;
audit.OriginalValue = x.ToString();
XYDataSets.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else
{
return false;
}
// Save audit record
audit.UserID = ((App)Application.Current).GetCurrentUserID();
Audits.Add(audit);
SaveChanges();
return true;
}
【问题讨论】:
-
对于更通用的东西,你可以试试
Audit.NET和它的EntityFramework extension。
标签: entity-framework audit change-tracking