【问题标题】:Changes not reflected in Database while using entity framework使用实体框架时未反映在数据库中的更改
【发布时间】:2013-08-02 05:21:56
【问题描述】:

我正在通过 MVC 3 应用程序中的 ADO.NET 实体框架访问我​​的数据库。

我正在通过存储过程更新我的数据库。

但是更改不会在运行时反映出来。我的意思是说我只能在重新启动后才能看到更改。

问题的原因是什么,我该如何避免? 我正在使用存储库模式所以在存储库我的代码看起来像这样

有一个函数可以保存更改

public void SaveNewAnswer(AnswerViewModel answer,string user) {

        SurveyAdminDBEntities _entities = new SurveyAdminDBEntities();
        _entities.usp_SaveNewAnswer(answer.QuestionId, answer.AnswerName, answer.AnswerText, answer.AnswerOrder, answer.Status, user);
        _entities.SaveChanges();

}

数据检索代码

公共 IEnumerableGetMultipleChoiceQuestions(字符串 questionId) {

        SurveyAdminDBEntities _entities = new SurveyAdminDBEntities();
        _entities.AcceptAllChanges();
        _entities.SaveChanges();
        return _entities.usp_GetMultipleChoiceQuestions(Int32.Parse(questionId));
    }

但是直到我不关闭浏览器的会话并再次运行它时,更改才会反映出来。

请帮忙!

提前谢谢你

【问题讨论】:

  • 看看具体有什么变化?
  • 您能否向我们展示您用于操作的一些代码?也许你遗漏了一些东西......(但我们无法读懂你的屏幕......)
  • 您能否发布映射到_entities.usp_SaveNewAnswer() 的存储过程的SQL 代码?

标签: asp.net-mvc asp.net-mvc-3 entity-framework


【解决方案1】:

您是否在您的实体(DbContext/ObjectContext)对象上调用context.SaveChanges()?您是否在使用尚未提交的事务?

如果您的存储过程中有未提交的事务,您可以尝试创建自己的实体事务并查看提交事务是否也会提交嵌套事务。问题是调用SaveChanges() 会自动开始并提交事务,所以这可能与此没有什么不同。

我还会在您的保存操作中调用_entities.AcceptAllChanges()

public void SaveNewAnswer(AnswerViewModel answer,string user) 
{
    SurveyAdminDBEntities _entities = new SurveyAdminDBEntities();
    _entities.Connection.Open();
    System.Data.Common.DbTransaction tran = _entities.Connection.BeginTransaction();        

    try
    {
        _entities.usp_SaveNewAnswer(answer.QuestionId, answer.AnswerName, answer.AnswerText, answer.AnswerOrder, answer.Status, user);
        _entities.SaveChanges(); // automatically uses the open transaction instead of a new one
        tran.Commit();
    }
    catch
    {
        tran.Rollback();
    }
    finally
    {
        if (_entities.Connection.State == System.Data.ConnectionState.Open)
                _entities.Connection.Close();

        _entities.AcceptAllChanges();
    }
}

【讨论】:

  • 我也尝试调用 context.SaveChanges() 但更改不会反映回来。很少有程序不会自己提交。
  • @Surender - 如果事务解决了您的问题,SaveChanges() 开始并提交自己的事务,因此您可以尝试添加 AcceptAllChanges() 而不是手动事务来测试它是否有效。 _entities.usp_SaveNewAnswer(answer.QuestionId, answer.AnswerName, answer.AnswerText, answer.AnswerOrder, answer.Status, user);_entities.SaveChanges();_entities.AcceptAllChanges();
【解决方案2】:

您的存储过程是否进行了显式提交?在数据库会话中运行的事物将可用于该会话,但在提交操作之前不可用于任何其他会话。

【讨论】:

  • 我正在通过函数导入进行更新。一些 sp 正在提交事务。有些没有提交。有什么办法可以让我从实体框架提交我的数据库。
【解决方案3】:

当您将数据从数据库中提取到上下文中时,数据将保存在内存中,与实际数据库本身分开。

如果您创建一个新的上下文对象实例并使用它从数据库中加载数据,您将看到更改。

最好不要使用上下文对象的相同实例,而是根据需要为与数据库的各个事务创建它们。在您的情况下,如果您通过函数导入而不是 context.SaveChanges() 方法进行更新,那么您需要在提交这些更改后使用更新的数据刷新您的上下文。

【讨论】:

  • 我只通过函数导入进行更新。如何使用更新的数据刷新上下文。
  • 编辑了我的问题!请帮忙!
  • @Surender - 调用 save 函数后,retrieve 函数将返回一个填充了更新数据的对象。我会确保您的堆栈以正确的顺序调用函数。如果您使用的是 Ajax,请确保您没有看到缓存的响应。此外,请确保在保存函数成功完成之前不会调用检索函数。
【解决方案4】:

将此添加到您的连接字符串(假设 sql 2005)

事务绑定=显式解除绑定;

如果会话重置后数据不再可用,则问题确实出在事务上,如果数据在重置后可用,那么您的问题有所不同,我们可能需要更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2016-08-11
    • 2010-10-14
    相关资源
    最近更新 更多