【问题标题】:Difference between SavingChanges event vs SaveChanges override?SavingChanges 事件与 SaveChanges 覆盖之间的区别?
【发布时间】:2015-01-09 21:32:53
【问题描述】:

我已经阅读了多篇关于如何使用实体框架实现审计日志的文章。我目前在DbContextSaveChanges 方法中嵌入了审计逻辑。请记住,下面的代码是 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


【解决方案1】:

我认为在大多数情况下这并不重要。我能想到的三种情况需要两种选择之一:

  1. SaveChanges 应该被完全覆盖,所以 base.SaveChanges 不应该被调用:只有覆盖才能做到这一点。

  2. 另一个类涉及保存更改时发生的事情:只有事件才能做到这一点。 (或者我应该说:一个事件是显而易见的选择)。

  3. 您希望选择扩展SaveChanges。根据我的口味,在构造函数中通过某个参数激活事件比使用if (option) 开始覆盖更干净,其中option 必须存储为成员变量。

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

【讨论】:

  • 我倾向于你的第二个项目。这样我就可以将审计作为一个“插件”来实现,而不是嵌入到上下文中。
  • 当然,这将是一个正当的理由。即便如此,我想我更愿意基于DbContext 创建自己的事件,可能在其 args 对象中携带上下文。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2020-07-10
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多