目前正在开发ASP.Net MVC 4应用程序。我被要求记录用户在应用程序中的所有更改。它只是Audit Trail
这是我的控制器代码
public ActionResult SaveBasicInfo(PatientBasicInfoViewModel basicInfoViewModel)
{
if (ModelState.IsValid)
{
var loggedInUserPersonId = ((User)Session["CurrentUser"]).PersonId;
long tenantId = TenantContext.TenantId;
var patient = Mapper.Map<PatientBasicInfoViewModel,
Patient>(basicInfoViewModel);
patient.TenantId = tenantId;
if (patient.PatientId > 0)
{
patient.UpdatedBy = loggedInUserPersonId;
patient.UpdatedDateTime = DateTime.Now;
patientService.UpdatePatientDetails(patient);
//Here need to do Audit Log
//Current User modified this fields values from `xx` to `yy` on
}
else
{
patient.AddedBy = loggedInUserPersonId;
patientService.AddPatient(patient);
// Here need to Log, This user created this patient record on Date
}
return RedirectToAction("Details", new { id = patient.PatientId });
}
return RedirectToAction("Details");
}
有人可以帮我设计一个适合所有组合的表结构。
同样如何记录旧值和新值?
也提到了Ideas on database design for capturing audit trails,但没有得到:(
替代解决方案:为每个需要审核并使用数据库触发器的表创建影子/历史记录表。解释here。
问题是,我怎么知道这个列值由此更改为此用户?我需要按用户显示所有历史记录以及记录
注意: 我们没有使用Entity Framework,我们使用简单的存储过程和ADO.Net并使用POCO类
帮助我从下面提到的 here
中选择最好的一个正在审核的每个表的单独“历史”表
正在跟踪所有变更表的合并“历史”表
答案 0 :(得分:0)
1-覆盖Context类中的SaveChanges方法
2-
public override int SaveChanges()
{
var autoDetectChanges = Configuration.AutoDetectChangesEnabled;
try
{
Configuration.AutoDetectChangesEnabled = false;
ChangeTracker.DetectChanges();
foreach (var entry in ChangeTracker.Entries().Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
{
// Save entry
// here you can get the Original Values or Current Values
entry.CurrentValues
entry.OriginalValues
}
ChangeTracker.DetectChanges();
Configuration.ValidateOnSaveEnabled = false;
return base.SaveChanges();
}
finally
{
Configuration.AutoDetectChangesEnabled = autoDetectChanges;
}
}
答案 1 :(得分:0)
在Ado.NET中
您可以使用DataTable来检索数据,
您可以使用以下
获取数据表上已修改行的完整更改集 DataTable ChangedDataTable= yourdataTable.GetChanges(DataRowState.Modified);
然后您可以使用DataRowVersion获取每个修改行的原始版本和当前版本
DataRowObject[0, DataRowVersion.Original] //by Column index
DataRowObject["ColumnName", DataRowVersion.Original] //by column name