データベース内の多くのレコードを最終的に更新する必要があるいくつかのネストされたループを持つコードの大きなブロックがあります。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への直接呼び出しのオプションを除く)。