efコアでObjectStateManager.ObjectStateManagerChanged
が見つかりませんでした。これは削除されましたか?Entity FrameworkコアのObjectStateManager.ObjectStateManagerChanged
エンティティがコンテキストに読み込まれるたびに通知を受けたいと考えています。
efコアでObjectStateManager.ObjectStateManagerChanged
が見つかりませんでした。これは削除されましたか?Entity FrameworkコアのObjectStateManager.ObjectStateManagerChanged
エンティティがコンテキストに読み込まれるたびに通知を受けたいと考えています。
現在(最新の公式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.Entry
とChangeTracker.Entries
方法と同様の)定期EntityEntry
オブジェクトを取得するにはInternalEntityEntry.ToEntityEntry()
メソッドを使用することができます。
EF Core v1.1.2でテストされ、動作しています。
偉大な答え。上司のように働く。小さな修正entry.ToEntityEntry()。エンティティは、あなたに通常のエンティティを与えます。すでに恩恵を与えていたでしょうが、SOは12時間待たなければならないと言います。 – Murdock
あなたは歓迎されて、喜んで助けました:) 'ToEntityEntry'については、(通常は' InternalEntityEntry'ではなく) '通常の' EntityEntry'オブジェクトを扱うことを意味しました。しかし、 'InternalEntityEntry'は' Entity'プロパティも持っていますので、 'ToEntityEntry'は本当に任意です。 –
確かに:)。私はそのエントリを追加するつもりでした。ToEntityEntry()。エンティティは、あなたのドメインから実際のエンティティを提供します。 – Murdock