gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:30 25 4
gpt4 key购买 nike

我已经阅读了多篇关于如何使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com