0

我有一大块代码,其中包含几个嵌套循环,最终需要更新数据库中的许多记录。我正在尝试尽量减少对实体框架的 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 重新分配给不同的值时,我是否需要在 foreach 循环中保存()才能使“obj”的所有实例持续存在。或者 DbSet.Attach(obj) 是否确保更新每个单独的实例,无论我对循环中的对象做什么。

或者也许更好的方法是:

鉴于 Attach() 看起来是通过引用传递的,因此只有我的最后一个 obj 将被更新,EF 完成此类事情的最佳实践是什么(不包括直接调用 SQL 的选项)?

4

1 回答 1

0

我认为你不必担心。一旦你调用Attach了你的对象,你自己是否保留对它的引用都没有关系。应该没问题。

The thing to keep in mind is that your object lives as long that it's referenced by someone. So, it stands to reason that calling Attach would cause your DbSet to reference your object, thus keeping it alive even after you don't reference it anymore yourself.

However, the best thing to do, in my opinion, is to just give it a try and see what happens!

于 2012-07-11T19:56:04.310 回答