在这种情况下,我应该期待什么持久性行为

时间:2012-07-11 19:45:27

标签: c# entity-framework repository-pattern

我有一大堆带有几个嵌套循环的代码,需要最终更新数据库中的许多记录。我试图最小化对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重新分配给不同的值,所以我需要在foreach循环中使用Save()以便所有“obj”实例都能保持不变。或者DbSet.Attach(obj)是否确保每个实例都得到更新,无论我对循环中的对象做了什么。

或许更好的方式是:

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

1 个答案:

答案 0 :(得分:0)

我认为你不必担心。在您的对象上调用Attach后,您是否自己保留对它的引用并不重要;应该没问题。

要记住的是,您的对象的存在时间与某人引用的一样长。因此,有理由认为调用Attach会导致您的DbSet引用您的对象,因此即使您不再自己引用它,也要保持它的存在。

但是,在我看来,最好的办法是试一试,看看会发生什么!