【发布时间】:2015-01-09 21:32:53
【问题描述】:
我已经阅读了多篇关于如何使用实体框架实现审计日志的文章。我目前在DbContext 的SaveChanges 方法中嵌入了审计逻辑。请记住,下面的代码是 EF4/5 实现,我正准备更新到 EF6。
namespace Database {
public class AuditDetails {
public string RemoteHost { get; set; }
public string RevisionUser { get; set; }
public string RevisionNotes { get; set; }
public DateTime RevisionDateTime { get; set; }
}
public class MyContext : DbContext {
// ... Unrelated overrides here ... //
public void SaveChanges(AuditDetails auditDetails) {
var saveCount = ProcessConcurrency();
var items = ChangeTracker.Entries<MyEntity>().ToList();
if (saveCount <= 0 || items == null || !items.Any() || auditDetails == null) return;
foreach (var item in items.Select(entityEntry => entityEntry.Entity).Where(i => i != null)) {
// ... create audit log using AuditDetails values ... //
}
// ... and call base.SaveChanges() ... //
}
}
}
所以问题是:
- 将其移至
SavingChanges事件处理程序是否有好处?或者可能拆分功能以同时使用两者? -
AuditDetails信息是否排除使用SavingChanges? - 我没有对
SaveChanges的覆盖,它接受在事务中使用的布尔参数。添加它会如何改变解决方案?
总结:
- 何时覆盖/实现
SaveChanges以及何时/为什么更喜欢使用SavingChanges事件处理程序?
【问题讨论】:
-
另外,作为一个新问题可能会更好:切换到异步 API 会改变使用哪种解决方案?
-
通常如果你从一个类继承,你会覆盖事件发生时被调用的方法,它的基本版本实际上调用了事件。当您从不同的类处理它时,您会使用该事件。
-
与
SavingChanges事件实现相关的问题:stackoverflow.com/questions/3808217/…
标签: c# entity-framework entity-framework-6