我继承了一些代码,其中现有的DBContext被分配给局部变量,如下所示:
using(var context = new DBContext())
{
try
{
...
var localContext = context;
MethodThatAddsStuffToContext(localContext);
...
}
catch etc. etc.
context.SaveChanges();
}
我的问题是:我知道不同的上下文会持续自己的更改,并且只有在保存后才能被其他上下文拾取,但是:
context
和localContext
将共享相同的添加,而保存一个将在另一个上提交更改?答案 0 :(得分:1)
- 上下文是否使用引用相等,这意味着上面的context和localContext将共享相同的添加,而保存一个将在另一个上提交更改?
醇>
这些不是两个上下文,它们是对相同上下文的两个引用。上下文是引用类型,而不是值类型。调用SaveChanges
时,将在一个且仅在上下文上调用它。如果您从localContext
或context
引用它并不重要。
- 如果我有两个现有的单独的上下文,并且我保存了一个,那么在将来的任何查询中都会在新的上下文中自动选择更改,或者上下文"缓存"在创建它的时候(很确定这个问题的答案是前者,但只是想澄清一下)?
醇>
并不完全清楚你的意思"缓存"并且"接受变化"。没有实体的缓存,只有上下文知道的实体对象的更改跟踪。变更跟踪基于每个上下文发生,这意味着当您实际上有两个独立的上下文时,保存在一个上下文中会更新此上下文的跟踪对象。另一个上下文不受这些更改的影响,因为它不知道第一个上下文的对象。
- 上面的代码片段是不是很糟糕?我无法想到任何可行的情况。
醇>
这个问题无法得到普遍回答。如果只涉及一个上下文,并且在分配后永远不会更改context
和localContext
,则代码没有任何意义,并且至少令人困惑(它使您感到困惑,这证明了这一点)。然而,在其他情况下,这样的分配是有意义的,例如当涉及多个上下文时,localContext
可以是其中之一。