反映ObjectContext中的所有更改,而不持久化到数据库

本文关键字:不持久 持久化 数据库 ObjectContext 反映 | 更新日期: 2023-09-27 18:29:40

因为ObjectContext.SaveChanges()发生在事务中,我决定我的应用程序最好先对ObjectContext执行所有查询/更新,然后再调用SaveChanges()一次将数据写入数据库。

然而,这样做意味着,如果我创建一个对象并随后查询ObjectContext,它会否认它的存在(可能是因为数据库尚未更新)。我以为我可以通过一些SaveOptions来解决这个问题,但看起来我做不到。

我基本上希望ObjectContext充当一个代理,我可以修改它,因为我希望一次性提交所有内容。我有办法做到这一点吗?

反映ObjectContext中的所有更改,而不持久化到数据库

如果不保存更改,则数据库中不存在新对象,并且对数据库执行的任何查询(=没有Linq-to-entities查询)都不会返回这些更改。要获得添加到上下文但尚未保存的对象,必须查询ObjectStateManager:

var data = context.ObjectStateManager
                  .GetObjectStateEntries(EntityState.Added)
                  .Where(e => !e.IsRelationship)
                  .Select(e => e.Entity)
                  .OfType<YourEntityType>();

在类似的情况下,我不得不沿着这些路线做一些事情:

给定一个键和值的列表,其中一些键是新的,并且想要在单个SaveChanges中更新/插入键和值,我首先下拉所有现有的键,然后维护一个单独的keysIncludingNewOnes集合,该集合从一开始只包含现有的键开始,但也会将任何新创建的键添加到其中。

然后,当我寻找与值关联的键对象时,我会在keysIncludingNewOnes中查找,而不是查询上下文,因为(正如您所发现的)上下文直到SaveChanges才知道新键。

您应该相对容易记住"挂起的添加"对象;如果不是这样,你可能有一个太长的生存环境,这通常会产生自己的问题。