使用实体框架时未在数据库中反映的更改

时间:2011-08-05 18:37:16

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

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

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

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

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

Ther是保存变化的一种功能

public void SaveNewAnswer(AnswerViewModel回答,字符串用户)  {

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

}

数据撤销代码

public IEnumerableGetMultipleChoiceQuestions(string questionId)  {

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

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

请帮忙!

提前谢谢

4 个答案:

答案 0 :(得分:2)

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

如果您的sproc中有未提交的事务,您可以尝试创建自己的实体事务,并查看提交事务是否也将提交嵌套事务。问题是调用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();
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

transaction binding = Explicit Unbind;

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