反映ObjectContext中的所有更改,而不持久化到数据库
本文关键字:不持久 持久化 数据库 ObjectContext 反映 | 更新日期: 2023-09-27 18:29:40
因为ObjectContext.SaveChanges()
发生在事务中,我决定我的应用程序最好先对ObjectContext
执行所有查询/更新,然后再调用SaveChanges()
一次将数据写入数据库。
然而,这样做意味着,如果我创建一个对象并随后查询ObjectContext
,它会否认它的存在(可能是因为数据库尚未更新)。我以为我可以通过一些SaveOptions来解决这个问题,但看起来我做不到。
我基本上希望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
才知道新键。
您应该相对容易记住"挂起的添加"对象;如果不是这样,你可能有一个太长的生存环境,这通常会产生自己的问题。