SavingChanges事件与SaveChanges之间的区别是否覆盖?

时间:2015-01-09 21:32:54

标签: c# entity-framework entity-framework-6

我已阅读多篇关于如何使用实体框架实施审核日志的帖子。我目前在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事件处理程序?

1 个答案:

答案 0 :(得分:1)

在大多数情况下,我认为这不重要。我可以想到有三种情况需要两种选择之一:

  1. SaveChanges应该被完全覆盖,因此不应该调用base.SaveChanges:只有覆盖才能执行此操作。

  2. 另一个类涉及保存更改时发生的事情:只有事件才能这样做。 (或者我应该说:一个事件将是明显的选择模式)。

  3. 您希望可选择扩展SaveChanges。根据我的喜好,通过某些参数激活构造函数中的事件比使用if (option)启动覆盖要快,其中option必须已存储为成员变量。

  4. 在所有其他情况下,我总是使用覆盖。该活动要求首先挖出ObjectContext(因为它ObjectContext.SavingChanges)。覆盖是硬连线的。事件订阅总是会在代码维护中以某种方式破坏。