0

データベース内の多くのレコードを最終的に更新する必要があるいくつかのネストされたループを持つコードの大きなブロックがあります。Entity FrameworkへのSaveChanges()呼び出しの数を最小限に抑えようとしています。また、リポジトリパターンを使用していることにも注意してください。

基本的に、私はコレクションを反復処理しており、コレクション内のアイテムと、反復ごとに、データベースから取得され、コレクションのアイテムによってコンテキスト化された別のオブジェクトの両方を更新する必要があります。

サンプルコード:

foreach (var outer in outerList)
            {
                obj = unit.GetRepository<MyObj>().Get(s =>
                    s.id = myId
                    ).SingleOrDefault();

                obj.value += outer.value;                    
                outer.objId = obj.objId;

                unit.GetRepository<MyOuterObj>().Update(outerObj);
                unit.GetRepository<MyObj>().Update(obj);                    
            }
            unit.Save();

Update()の呼び出しは、以下を実行します。

public virtual void Update(T entityToUpdate)
    {
        if(entityToUpdate is AuditModelBase)
        {
            var model = entityToUpdate as AuditModelBase;
            model.UpdatedAt = DateTime.UtcNow;
        }

        DbSet.Attach(entityToUpdate);
        Context.Entry(entityToUpdate).State = EntityState.Modified;
    }

もちろん、Save()の呼び出しは次のことを実行します。

_context.SaveChanges();

したがって、私の質問は、ループを介して毎回objを異なる値に再割り当てしているので、「obj」のすべてのインスタンスを持続させるために、foreachループ内にSave()が必要ですか?または、DbSet.Attach(obj)は、ループ内のオブジェクトをどのように処理するかに関係なく、個々のインスタンスが更新されることを保証しますか。

または、おそらくこれを尋ねるより良い方法は次のとおりです。

Attach()が参照渡しであるように見えるため、最後のobjのみが更新されるとすると、この種のことを実現するためのEFのベストプラクティスは何ですか(SQLへの直接呼び出しのオプションを除く)。

4

1 に答える 1

0

心配する必要はないと思います。オブジェクトを呼び出したらAttach、それへの参照を自分で保持するかどうかは問題ではありません。大丈夫なはずです。

心に留めておくべきことは、オブジェクトは誰かによって参照されている限り存続するということです。したがって、呼び出すとオブジェクトが参照されるため、Attach自分DbSetでオブジェクトを参照しなくなった後でもオブジェクトを存続させるのは理にかなっています。

ただし、私の意見では、最善の方法は、試してみて、何が起こるかを確認することです!

于 2012-07-11T19:56:04.310 に答える