Похоже, вы хотите, чтобы ваш OnSave
метод был одноэлементным (тот же метод, который используется во всех случаях вашего DbContext
).
Один из способов решить эту проблему - переместить Action
вновый класс:
public class MySaveEventHandler {
public System.Action<IEnumerable<EntityEntry>> OnSave;
}
Затем добавьте его как одиночный файл в ваш Startup.cs, чтобы сделать его доступным для внедрения зависимостей:
services.AddSingleton<MySaveEventHandler>();
Затем измените ваш DbContext
конструктор, чтобы он принималчерез 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();
}
Чтобы установить метод OnSave
, вы просто получаете свой единственный экземпляр MySaveEventHandler
через DI и устанавливаете его.Тогда каждый экземпляр вашего DbContext
будет использовать его.
Примечание: вы можете использовать событие вместо делегата.На самом деле я не думаю, что это будет иметь большое функциональное значение, но здесь есть кое-что интересное: https://docs.microsoft.com/en-us/dotnet/csharp/distinguish-delegates-events