关闭上下文后,从实体获取原始值实体框架

本文关键字:实体 获取 原始 框架 上下文 | 更新日期: 2023-09-27 18:35:07

我试图在上下文关闭后从实体中检索原始值,但我得到了当前值。有什么建议吗?无法将实体连接到对象,我必须关闭它。考虑一个通用模型,下面的只是一个示例。

为了让您理解,这是我的示例(作为参考,db可以在这里找到: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:释放上下文时原始值会丢失

关闭上下文后,从实体获取原始值实体框架

问题在于,由于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);
}

正如 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
}