实体框架 - DBContext Equality

时间:2017-03-03 10:28:12

标签: c# entity-framework dbcontext equality

我继承了一些代码,其中现有的DBContext被分配给局部变量,如下所示:

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

     var localContext = context;
     MethodThatAddsStuffToContext(localContext);

     ...
   }
    catch etc. etc.

  context.SaveChanges();
}

我的问题是:我知道不同的上下文会持续自己的更改,并且只有在保存后才能被其他上下文拾取,但是:

  1. 上下文是否使用引用相等,这意味着上面的contextlocalContext将共享相同的添加,而保存一个将在另一个上提交更改?
  2. 如果我有两个现有的单独上下文,并且我保存了一个,那么在未来的任何查询中,是否会在新上下文中自动获取更改,或者在创建它时创建上下文“缓存”(非常确定回答这个是前者,但只是想澄清一下)?
  3. 上面的代码片段是不是很糟糕?我想不出任何可行的情况。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 上下文是否使用引用相等,这意味着上面的context和localContext将共享相同的添加,而保存一个将在另一个上提交更改?
  2.   

这些不是两个上下文,它们是对相同上下文的两个引用。上下文是引用类型,而不是值类型。调用SaveChanges时,将在一个且仅在上下文上调用它。如果您从localContextcontext引用它并不重要。

  
      
  1. 如果我有两个现有的单独的上下文,并且我保存了一个,那么在将来的任何查询中都会在新的上下文中自动选择更改,或者上下文"缓存"在创建它的时候(很确定这个问题的答案是前者,但只是想澄清一下)?
  2.   

并不完全清楚你的意思"缓存"并且"接受变化"。没有实体的缓存,只有上下文知道的实体对象的更改跟踪。变更跟踪基于每个上下文发生,这意味着当您实际上有两个独立的上下文时,保存在一个上下文中会更新此上下文的跟踪对象。另一个上下文不受这些更改的影响,因为它不知道第一个上下文的对象。

  
      
  1. 上面的代码片段是不是很糟糕?我无法想到任何可行的情况。
  2.   

这个问题无法得到普遍回答。如果只涉及一个上下文,并且在分配后永远不会更改contextlocalContext,则代码没有任何意义,并且至少令人困惑(它使您感到困惑,这证明了这一点)。然而,在其他情况下,这样的分配是有意义的,例如当涉及多个上下文时,localContext可以是其中之一。