使用已编辑的数据库检查原始数据库记录时出现问题

时间:2011-09-12 08:33:38

标签: database linq debugging entity-framework

我在使用Visual Studio 2010和sql server 2008中的Linq保存数据库记录时遇到问题。 我的问题是,当我编辑一些记录时,我有时会检查原始数据库记录以进行验证,只有原始条目似乎是实时更新的 - 即。在我提交更改之前,它已经与编辑过的记录完全相同了!

有人能建议一种有效的方法来解决这个问题吗?我已尝试使用第二个数据库连接或第二个数据存储库从数据库调用原始记录,但在调试时它似乎已经更改。

public void SaveobjectEdit(object objectToEdit)
{ 
    object originalObject = GetobjectById(objectToEdit.Id); 
    if (originalObject.objectStatus !=  objectToEdit.objectStatus) 
    { 
        originalObject.objectStatus = objectToEdit.objectStatus; 
    }
SaveChanges(); 
}

保存更改只调用_db.SubmitChanges();顺便说一句


对于上述问题,没有人有任何想法吗?

我希望我很清楚 - 出于验证目的,我想将原始数据库记录与我正在编辑的记录进行比较。问题是当我编辑一条记录然后在保存之前尝试检索原始记录时 - 原始记录与编辑记录完全相同。

1 个答案:

答案 0 :(得分:2)

如果您尝试使用相同的访问方法检索代码中的原始记录来自相同的“上下文”,那么它将包含更新的对象。我不会问你为什么这样做或者你想要实现什么,而是解释我如何理解数据上下文/对象上下文的工作方式(以非常宽松和模糊的方式)。

上下文类似于数据库的内存表示,其中所有内容都是延迟加载的。当您实例化上下文时,您将获得一个表示您的数据模型的对象(当然,它可能不是1-1表示,并且可以包含各种抽象)。在必要之前,没有任何东西加载到上下文中;您编写的任何查询都将保留为查询,直到您查看结果为止。当您访问某个项目(例如GetobjectById(objectToEdit.Id))时,该项目会从数据库加载到上下文中,您可以随意getset其属性。

现在,重要的部分:当您访问某个项目时,如果它已加载到上下文中,则返回该内存中对象。上下文并不关心检查所做的更改;在您提交之前,更改不会持久保存到数据库中,但它们会保留在内存中。

刷新内存中对象的方法是在上下文中调用Refresh方法。试试这个测试:

using (var db = new MyObjectContext())
{
    var item = db.Items.First();

    item.Name = "testing this thing";
    Console.WriteLine(db.Shifts.First().Name);

    db.Refresh(System.Data.Objects.RefreshMode.StoreWins, db.Items);
    Console.WriteLine(db.Shifts.First().Name);
}

我相信这种模式很有意义,我不确定它是否能以任何其他方式运作。考虑一下:

foreach (var item in db.Items)
{
    item.Name = "test";
}

Assert(db.Items.All(item => item.Name == "test"));

您希望Assert失败吗?这些物品应该重新加载吗?我不相信。我正在查看上下文中的项目,而不是数据库中的项目。我没有检查数据库中的项目是否已更新,而是我已经更新了代码上下​​文中的所有项目。

这是我不使用MyObjectContext db的一个很好的理由 - 它是'db'或数据库连接。这是一个我可以改变我想要的东西的背景,所以我这样命名:MyObjectContext context