实体框架 - 的DbContext平等

问题描述:

我继承了一些代码,其中一个现有的DbContext被分配到一个局部变量像这样:实体框架 - 的DbContext平等

using(var context = new DBContext()) 
{ 
    try 
    { 
    ... 

    var localContext = context; 
    MethodThatAddsStuffToContext(localContext); 

    ... 
    } 
    catch etc. etc. 

    context.SaveChanges(); 
} 

我的问题是:我知道,不同的背景下会持续自己的变化并且,他们将只能通过其他上下文后捞起保存,但:

  1. 执行上下文使用引用相等,这意味着context以上localContext将共享相同的补充,并保存一个将承诺在其他变化?
  2. 如果我有两个现有的独立上下文,并且我保存一个,那么将在任何未来查询的新上下文中自动提取这些更改,或者在创建它时确保上下文“缓存”(非常确定回答这是前者,但只是想澄清)?
  3. 上面的代码片段是不好的做法吗?我想不出任何可行的情况。
+5

context和localContext只是两个指向DBContext实例的变量。所以你不能说他们“分享”某种东西,或者说他们是“分离的”。这里只有一个背景,而不是两个。 – Evk

+0

@Evk,那么参考平等呢?这就是我所问的。我找不到任何有关DBContexts的.Equals行为的任何文档,因此是个问题。我看不到任何理由*为什么有人会做前任建筑师所做的事情,如果这不是价值平等。 –

+2

那么所有的类(不是结构体)默认使用引用相等,除非类作者以某种方式改变了这种行为。但是对DbContext使用值相等没有任何意义,无法想象这可能意味着什么。在您提供的代码片段中复制变量绝对没有意义。 – Evk

  1. 执行上下文使用引用相等,这意味着上下文和上述localContext将共享相同的补充,并保存一个将承诺在其他的变化?

这些不是两个上下文,它们是对同一上下文的两个引用。上下文是引用类型,而不是值类型。当调用SaveChanges时,它仅在一个上下文中被调用。从localContextcontext引用它并不重要。

  1. 如果我有两个现有单独的上下文,以及我保存一个,将变化是在新的环境自动拾起的任何未来的查询,或者做一个上下文中,“高速缓存“在它创建的时候(很确定这个答案是前者,但只是想澄清)?
开始=“2”>

这并不完全清楚你的意思是“缓存”和“提取变化”。没有实体的缓存,只有上下文知道的实体对象的变化跟踪。更改跟踪发生在每个上下文的基础上,这意味着当您确实有两个独立的上下文时,保存在一个上下文中更新此上下文的跟踪对象。其他上下文仍然不受这些更改的影响,因为它不知道第一个上下文的对象。

  1. 上面的代码片段是不好的做法吗?我想不出任何可行的情况。

这个问题不能一概而论。如果只涉及一个上下文,并且在赋值之后contextlocalContext都不会改变,那么代码就没有意义,至少会让人感到困惑(它使您感到困惑,这证明了这一点)。然而,在其他情况下,这样的分配是有意义的,例如当涉及多个上下文并且可以是其中的任何一个时。