2014-12-22 101 views
0

我試圖從上下文關閉後的實體中檢索OriginalValues,但我得到CurrentValues。任何建議? 無法將實體連接到對象,我必須關閉它。想想一個通用模型,下面的模型只是一個示例。上下文關閉後從實體獲取OriginalValues實體框架

爲了讓你understaind,我在這裏的樣品(如參考數據庫可以在這裏找到:http://msdn.microsoft.com/en-us/data/jj592677.aspx

public static void Sample1() 
{ 
    var blog = null; 

    //1: get from context 
    using (var context = new BloggingContext()) 
    { 
     blog = context.Blogs.Find(1); 
     //suppose -> blog.Name == "Test 1"; 
    } 

    blog.Name = "Test 2"; //set name 

    //The function here set the blog name record to "Test 3", using straight SQL 
    SetBlogNameUsingExternalSQL("Test 3", 1); 

    //2: get original values 
    using (var context = new BloggingContext()) 
    { 
     context.Blogs.Attach(blog); 
     var currentValues = context.Entry(blog).CurrentValues; 
     //currentValues.Name is "Test 2", expected is "Test 2" => OK 
     var databaseValues = context.Entry(blog).GetDatabaseValues(); 
     //databaseValues.Name is "Test 3", expected is "Test 3" => OK 
     var originalValues = context.Entry(blog).OriginalValues; 
     // -------> originalValues.Name is "Test 2", expected is "Test 1" => :(
    } 
} 

注:這並不能幫助我很多:EF 5 : OriginalValues are lost when context is disposed

+1

'OriginalValues'總是爲當前_context_存儲,而不是全局存儲。當處理第一個上下文時,它不再存在,所以那些'OriginalValues'消失了。第二個上下文將它的'OriginalValues'作爲它初次附着在它上面的對象存儲,即「Test 2」。如果您需要訪問「測試1」,則必須將其與任何EF上下文分開存儲。 – Rhumborl

回答

1

的問題是, ,因爲DbContext負責維護原始值的方式,第二個DbContext根本不知道它們。

至少,您將不得不自己傳輸這些值。

例如:

Blog blog = null; 
DbPropertyValues originalBlogValues = null; 

//1: get from context 
using (var context = new BloggingContext()) 
{ 
    blog = context.Blogs.Find(1); 
    originalBlogValues = context.Entry(blog).OriginalValues; 
} 

blog.Name = "Test 2"; 

using (var context = new BloggingContext()) 
{ 
    context.Blogs.Attach(blog); 
    context.Entry(blog).OriginalValues.SetValues(originalBlogValues); 
} 
+0

謝謝。 「......問題是,因爲......他們......」這是我想聽的東西。事實上,我已經做了像你說的,我將原始值存儲在一個臨時變量,但我想有一個確認我的問題:) –

0
作爲

Rhumborl和Jean Hominal答覆OriginalValues始終存儲在所加載的上下文中,並且設置與該上下文。因此,建議的解決方案可能是在第一個上下文創建中存儲原始值。

var originalValues = null; 

//1: get from context 
using (var context = new BloggingContext()) 
{ 
    blog = context.Blogs.Find(1); 
    //suppose -> blog.Name == "Test 1"; 
    originalValues = context.Entry(blog).OriginalValues; //load OriginalValues here 
}