SavingChanges 事件与 SaveChanges 覆盖之间的区别?
Difference between SavingChanges event vs SaveChanges override?
我已经阅读了多篇关于如何使用 entity framework 实现审计日志的文章。我目前在 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
的覆盖,它接受在交易中使用的布尔参数。添加它会如何改变解决方案?
总结:
- 您什么时候 override/implement
SaveChanges
并且 when/why 您更愿意使用 SavingChanges
事件处理程序?
我认为在大多数情况下这并不重要。我可以想到三种情况,需要两种选择之一:
SaveChanges
应该被完全覆盖,所以 base.SaveChanges
不应该被调用:只有覆盖才能做到这一点。
另一个 class 涉及保存更改时发生的事情:只有事件可以做到这一点。 (或者也许我应该说:一个事件将是显而易见的选择模式)。
您想要选择性地扩展 SaveChanges
。根据我的口味,通过某些参数在构造函数中激活事件比使用 if (option)
开始覆盖更清晰,其中 option
必须已存储为成员变量。
在所有其他情况下,我总是使用覆盖。该事件要求先挖出 ObjectContext
(因为它是 ObjectContext.SavingChanges
)。覆盖是硬连线的。事件订阅总是会在代码维护中以某种方式中断。
我已经阅读了多篇关于如何使用 entity framework 实现审计日志的文章。我目前在 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
的覆盖,它接受在交易中使用的布尔参数。添加它会如何改变解决方案?
总结:
- 您什么时候 override/implement
SaveChanges
并且 when/why 您更愿意使用SavingChanges
事件处理程序?
我认为在大多数情况下这并不重要。我可以想到三种情况,需要两种选择之一:
SaveChanges
应该被完全覆盖,所以base.SaveChanges
不应该被调用:只有覆盖才能做到这一点。另一个 class 涉及保存更改时发生的事情:只有事件可以做到这一点。 (或者也许我应该说:一个事件将是显而易见的选择模式)。
您想要选择性地扩展
SaveChanges
。根据我的口味,通过某些参数在构造函数中激活事件比使用if (option)
开始覆盖更清晰,其中option
必须已存储为成员变量。
在所有其他情况下,我总是使用覆盖。该事件要求先挖出 ObjectContext
(因为它是 ObjectContext.SavingChanges
)。覆盖是硬连线的。事件订阅总是会在代码维护中以某种方式中断。