我已阅读多篇关于如何使用实体框架实施审核日志的帖子。我目前在SaveChanges
的{{1}}方法中嵌入了审计逻辑。请记住,下面的代码是EF4 / 5实现,我准备更新到EF6。
DbContext
所以问题是:
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
的覆盖,它接受在事务中使用的Boolean参数。如何添加更改解决方案?摘要:
SaveChanges
以及何时/为什么您更愿意使用SaveChanges
事件处理程序?答案 0 :(得分:1)
在大多数情况下,我认为这不重要。我可以想到有三种情况需要两种选择之一:
SaveChanges
应该被完全覆盖,因此不应该调用base.SaveChanges
:只有覆盖才能执行此操作。
另一个类涉及保存更改时发生的事情:只有事件才能这样做。 (或者我应该说:一个事件将是明显的选择模式)。
您希望可选择扩展SaveChanges
。根据我的喜好,通过某些参数激活构造函数中的事件比使用if (option)
启动覆盖要快,其中option
必须已存储为成员变量。
在所有其他情况下,我总是使用覆盖。该活动要求首先挖出ObjectContext
(因为它ObjectContext.SavingChanges
)。覆盖是硬连线的。事件订阅总是会在代码维护中以某种方式破坏。