entity framework核心中的ObjectStateManager.ObjectStateManagerChanged

我似乎无法在ef核心中找到ObjectStateManager.ObjectStateManagerChanged 。 这已被删除,如果是这样,有什么替代方案?

我想在实体加载到上下文时收到通知。

目前(最新的官方EF Core v1.1.2)没有公共替代方案。 有计划公开Lifetime Hooks ,但根据EF Core Roadmap,它们被推迟,将在即将发布的v2.0版本中不可用。

幸运的是,EF Core公开了所有内部基础设施类/接口,因此我建议在典型的EF Core内部使用免责声明下进行以下解决方法

此API支持Entity Framework Core基础结构,不能直接在您的代码中使用。 此API可能会在将来的版本中更改或删除。

我想到的是利用Microsoft.EntityFrameworkCore.ChangeTracking.Internal命名空间,更具体地说是ILocalViewListener接口,它提供了以下方法

 void RegisterView(Action viewAction) 

viewAction允许您注册将在任何实体状态更改时调用的委托,包括附加,添加,删除,分离等。

因此,在DbContext派生类构造函数中,您可以获取ILocalViewListener服务并注册处理程序,如下所示:

 using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; public class MyDbContext : DbContext { // ... public MyDbContext() { this.GetService()?.RegisterView(OnStateManagerChanged); } void OnStateManagerChanged(InternalEntityEntry entry, EntityState previousState) { if (previousState == EntityState.Detached && entry.EntityState == EntityState.Unchanged) { // Process loaded entity var entity = entry.Entity; } } } 

在处理程序InternalEntityEntry.ToEntityEntry()如果您更喜欢使用它而不是内部的InternalEntityEntry类,也可以使用InternalEntityEntry.ToEntityEntry()方法来获取常规的EntityEntry对象(类似于DbContext.EntryChangeTracker.Entries方法)。

在EF Core v1.1.2中测试并使用。