2017-07-16 155 views

回答

4

目前(最新官方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.EntryChangeTracker.Entries方法),如果你喜歡使用它,而不是內部InternalEntityEntry類。

測試並在EF核心v1.1.2工作。

+0

很棒的回答。像老闆一樣工作。小修正entry.ToEntityEntry()。實體爲您提供常規實體。本來已經給了你賞金,但是說我必須等12個小時。 – Murdock

+0

歡迎您,很高興它幫助:)「ToEntityEntry」怎麼樣,我的意思是讓「正常的」EntityEntry對象(而不是'InternalEntityEntry')工作。但是'InternalEntityEntry'具有提供規則實體的'Entity'屬性,所以'ToEntityEntry'實際上是任意的。 –

+0

確實:)。我只是想添加entry.ToEntityEntry()。實體爲您提供了來自您的域的實際實體。 – Murdock