EF6からEFコアへのリファクタリング

c# entity-framework entity-framework-6 entity-framework-core

質問

私はいくつかのEF6コードをEF Core 1にリファクタリングしようとしていて、小さなつまずきをしました。私が変換しようとしているコードはここにあります:

https://github.com/mehdime/DbContextScope

すべてがほとんど問題ありませんが、特にDbContextScope.csは注意が必要です(例:このメソッド(簡潔にするために編集))。

        public void RefreshEntitiesInParentScope(IEnumerable entities)
    {
        foreach (IObjectContextAdapter contextInCurrentScope in 
            _dbContexts.InitializedDbContexts.Values)
        {
            var correspondingParentContext =
                _parentScope._dbContexts.InitializedDbContexts.Values
                    .SingleOrDefault(parentContext => 
                        parentContext.GetType() == contextInCurrentScope.GetType())
                           as IObjectContextAdapter;

            if (correspondingParentContext == null)
                continue;

            foreach (var toRefresh in entities)
            {
                ObjectStateEntry stateInCurrentScope;
                if (contextInCurrentScope.ObjectContext.ObjectStateManager
                        .TryGetObjectStateEntry(toRefresh, out stateInCurrentScope))
                {
                    var key = stateInCurrentScope.EntityKey;

                    ObjectStateEntry stateInParentScope;
                    if (correspondingParentContext.ObjectContext.ObjectStateManager
                       .TryGetObjectStateEntry(key, out stateInParentScope))
                    {
                        if (stateInParentScope.State == EntityState.Unchanged)
                        {
                            correspondingParentContext.ObjectContext.Refresh(
                                RefreshMode.StoreWins, stateInParentScope.Entity);
                        }
                    }
                }
            }
        }
    }

質問です。

まず、ObjectContext.ObjectStateManagerを新しいChangeTrackerに置き換えることができますが、取得したエントリが正しく取得されていることを確認したいのですが。

contextInCurrentScope.ObjectContext.ObjectStateManager
    .TryGetObjectStateEntry(toRefresh, out stateInCurrentScope)

次に、EF Coreでこれに相当するものは何ですか?

correspondingParentContext.ObjectContext.Refresh

ありがとうございます。

Ps上記のGitHubレポジトリのソースには多くの役に立つコメントがあります。

人気のある回答

エンティティのエントリを取得するための正しい方法、つまりキーと状態を取得する正しい方法は、次のとおりです。

var entry = contextInCurrentScope.Entry(toRefresh);
var keys = entry.Metadata.GetKeys();
var state = entry.State;

次のようにエントリを使用して、データベースから単一のエンティティを更新することもできます。

entry.Reload();


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ