我似乎無法在ef核心中找到ObjectStateManager.ObjectStateManagerChanged
。這是否已被刪除,如果有的話是什麼?實體框架核心中的ObjectStateManager.ObjectStateManagerChanged
我希望在實體加載到上下文時得到通知。
我似乎無法在ef核心中找到ObjectStateManager.ObjectStateManagerChanged
。這是否已被刪除,如果有的話是什麼?實體框架核心中的ObjectStateManager.ObjectStateManagerChanged
我希望在實體加載到上下文時得到通知。
目前(最新官方EF核心v1.1.2)沒有公共選擇。有計劃要公開Lifetime Hooks,但根據EF Core Roadmap,它們被推遲並且在即將發佈的v2.0版本中不可用。
幸運的是EF核心暴露所有的內部基礎設施類/接口,所以我可以在典型的EF核心內部使用條款
此API支持實體框架的核心基礎結構,不打算下建議採取以下解決辦法直接從你的代碼中使用。此API可能會在以後的版本中更改或刪除。
我心目中是利用Microsoft.EntityFrameworkCore.ChangeTracking.Internal
命名空間,更具體的ILocalViewListener
接口,它提供了以下方法
void RegisterView(Action<InternalEntityEntry, EntityState> viewAction)
的viewAction
允許您註冊委託,它將對任何實體的狀態被稱爲什麼包括附加,添加,刪除,分離等。
所以在你的DbContext
派生類的構造函數中,你可以獲得ILocalViewListener
服務和re gister這樣的處理程序:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
using Microsoft.EntityFrameworkCore.Infrastructure;
public class MyDbContext : DbContext
{
// ...
public MyDbContext()
{
this.GetService<ILocalViewListener>()?.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()
方法來獲取定期EntityEntry
對象(類似於DbContext.Entry
和ChangeTracker.Entries
方法),如果你喜歡使用它,而不是內部InternalEntityEntry
類。
測試並在EF核心v1.1.2工作。
很棒的回答。像老闆一樣工作。小修正entry.ToEntityEntry()。實體爲您提供常規實體。本來已經給了你賞金,但是說我必須等12個小時。 – Murdock
歡迎您,很高興它幫助:)「ToEntityEntry」怎麼樣,我的意思是讓「正常的」EntityEntry對象(而不是'InternalEntityEntry')工作。但是'InternalEntityEntry'具有提供規則實體的'Entity'屬性,所以'ToEntityEntry'實際上是任意的。 –
確實:)。我只是想添加entry.ToEntityEntry()。實體爲您提供了來自您的域的實際實體。 – Murdock