2017-07-16 18 views

答えて

4

現在(最新の公式EFコアv1.1.2)公開されている代替手段はありません。 Lifetime Hooksが公開される予定ですが、EF Core Roadmapによれば、延期され、今後のv2.0リリースでは利用できなくなります。

幸いにもEFコアは、すべての内部インフラストラクチャのクラス/インタフェースを公開しますので、私は

このAPIは、Entity Frameworkのコアインフラストラクチャをサポートしに意図されていない典型的なEFコア内部の使用状況に関する免責下の次の回避策を提案することができコードから直接使用することができます。このAPIは将来のリリースで変更されるか、または削除される可能性があります。私が考えていることはMicrosoft.EntityFrameworkCore.ChangeTracking.Internal名前空間を利用して、より具体的には下記の方法

void RegisterView(Action<InternalEntityEntry, EntityState> viewAction) 

viewActionを提供ILocalViewListenerインタフェースを使用すると、任意のエンティティの状態で呼び出されるデリゲートを登録することができますされ

変更、添付、追加、削除、切り離しなどを含む

したがって、DbContext派生クラスのコンストラクタ内で、ILocalViewListenerサービスを取得して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クラスではなく、それを扱うことを好む場合(DbContext.EntryChangeTracker.Entries方法と同様の)定期EntityEntryオブジェクトを取得するにはInternalEntityEntry.ToEntityEntry()メソッドを使用することができます。

EF Core v1.1.2でテストされ、動作しています。

+0

偉大な答え。上司のように働く。小さな修正entry.ToEntityEntry()。エンティティは、あなたに通常のエンティティを与えます。すでに恩恵を与えていたでしょうが、SOは12時間待たなければならないと言います。 – Murdock

+0

あなたは歓迎されて、喜んで助けました:) 'ToEntityEntry'については、(通常は' InternalEntityEntry'ではなく) '通常の' EntityEntry'オブジェクトを扱うことを意味しました。しかし、 'InternalEntityEntry'は' Entity'プロパティも持っていますので、 'ToEntityEntry'は本当に任意です。 –

+0

確かに:)。私はそのエントリを追加するつもりでした。ToEntityEntry()。エンティティは、あなたのドメインから実際のエンティティを提供します。 – Murdock

関連する問題