c# - SavingChanges 事件与 SaveChanges 覆盖之间的区别?

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

我已经阅读了多篇有关如何使用 Entity Framework 实现审核日志的文章。目前,我已将审核逻辑嵌入到 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 来接受在事务中使用的 bool 参数。添加它会如何改变解决方案?

总结:

  • 您何时会重写/实现 SaveChanges 以及您何时/为何更愿意使用 SavingChanges 事件处理程序?

最佳答案

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

  1. SaveChanges 应完全重写,因此不应调用 base.SaveChanges:只有重写才能执行此操作。

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

  3. 您想要选择性地扩展 SaveChanges。根据我的口味,通过某个参数在构造函数中激活事件比使用 if (option) 启动覆盖更清晰,其中 option 必须存储为成员变量.

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

关于c# - SavingChanges 事件与 SaveChanges 覆盖之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869600/

相关文章:

c# - 在源中使用 NotMapped/Compulated 属性映射到目标时,Automapper ProjectTo<>() 出现问题

c# - LINQ to Entities无法识别: LastOrDefault [duplicate]方法

c# - 基类的处理顺序

c# - 如何使用 NPOI 读取文件

mysql - 不是从 Entity Framework 中的表生成的类

entity-framework - EntityState.Deleted 正在从我的列表中删除项目

c# - 如何将 secret 从 VSTS 传递到测试执行上下文

c# - 在 MVC 中从 Google OAuth API 检索出生日期

具有 8 位 ASCII 数据的 LINQ 到实体

c# - 如何对将记录插入 RIA 服务数据库的函数进行单元测试?