代码之家  ›  专栏  ›  技术社区  ›  meds

在EFCore中保存更改时回调?

  •  1
  • meds  · 技术社区  · 5 年前

    DbContext :

    public System.Action<IEnumerable<EntityEntry>> OnSave;
    
    public override int SaveChanges() {
        if(OnSave != null)
             OnSave(ChangeTracker.Entries());
    
        return base.SaveChanges();
    }
    

    数据库上下文 到另一个类中,该类可以挂接到“OnSave”函数。

    我不认为这将工作或可靠的时候 数据库上下文 注入到多个地方,因为我很确定我们最终会有多个 数据库上下文

    1 回复  |  直到 5 年前
        1
  •  0
  •   Gabriel Luci    5 年前

    OnSave 方法是一个单例(与您的所有实例中使用的方法相同) DbContext

    解决这个问题的一个方法是移动你的 Action 到新类:

    public class MySaveEventHandler {
         public System.Action<IEnumerable<EntityEntry>> OnSave;
    }
    

    然后在Startup.cs中将其作为单例添加,以使其可用于依赖项注入:

    services.AddSingleton<MySaveEventHandler>();
    

    数据库上下文 构造器通过DI接受它,并在您的应用程序中使用它 SaveChanges 方法:

    MySaveEventHandler _mySaveEventHandler;
    
    public MyDbContext(DbContextOptions<MyDbContext> options, MySaveEventHandler mySaveEventHandler) : base(options) {
        _mySaveEventHandler = mySaveEventHandler;
    }
    
    public override int SaveChanges() {
        if(_mySaveEventHandler.OnSave != null)
             _mySaveEventHandler.OnSave(ChangeTracker.Entries());
    
        return base.SaveChanges();
    }
    

    设置 保存 方法,你只需得到你的单曲 MySaveEventHandler 通过DI实例并设置它。那么你的每一个例子 数据库上下文 我会用的。

    旁注:您可以使用事件而不是委托。我真的不认为它会对功能产生多大的影响,但这里有一些有趣的阅读: https://docs.microsoft.com/en-us/dotnet/csharp/distinguish-delegates-events