2014-12-22 103 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 
}