2017-03-03 105 views
0

我繼承了一些代碼,其中一個現有的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
  1. 執行上下文使用引用相等,這意味着上下文和上述localContext將共享相同的補充,並保存一個將承諾在其他的變化?

這些不是兩個上下文,它們是對同一上下文的兩個引用。上下文是引用類型,而不是值類型。當調用SaveChanges時,它僅在一個上下文中被調用。從localContextcontext引用它並不重要。

  • 如果我有兩個現有單獨的上下文,以及我保存一個,將變化是在新的環境自動拾起的任何未來的查詢,或者做一個上下文中,「高速緩存「在它創建的時候(很確定這個答案是前者,但只是想澄清)?
  • 這並不完全清楚你的意思是「緩存」和「提取變化」。沒有實體的緩存,只有上下文知道的實體對象的變化跟蹤。更改跟蹤發生在每個上下文的基礎上,這意味着當您確實有兩個獨立的上下文時,保存在一個上下文中更新此上下文的跟蹤對象。其他上下文仍然不受這些更改的影響,因爲它不知道第一個上下文的對象。

    1. 上面的代碼片段是不好的做法嗎?我想不出任何可行的情況。

    這個問題不能一概而論。如果只涉及一個上下文,並且在賦值之後contextlocalContext都不會改變,那麼代碼就沒有意義,至少會讓人感到困惑(它使您感到困惑,這證明了這一點)。然而,在其他情況下,這樣的分配是有意義的,例如當涉及多個上下文並且可以是其中的任何一個時。