2011-08-05 41 views
0

我正在通过MVC 3应用程序中的ADO.NET实体框架访问我​​的数据库。使用实体框架时数据库中未反映的更改

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

但变化不会在运行再寄一次体现的意思是说,我能够重新启动仅之后看到的变化。

什么是问题的原因以及如何避免呢? 我使用Repository模式因此,在库我的代码看起来象

疗法是一种功能,保存更改

公共无效SaveNewAnswer(AnswerViewModel答案,字符串用户) {

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

}

数据Retreival代码

公共IEnumerableGetMultipleChoiceQuesti附件(字符串questionId) {

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

但更改不会反映,直到我不clode浏览器会话并再次运行的时间。

请帮忙!

预先感谢您

+1

查看具体有哪些变化? –

+0

您可以向我们展示**您用于操作的一些代码**吗?也许你错过了一些.....(但我们无法介意 - 读你的屏幕....) –

+0

添加我的问题! –

回答

2

你叫你的实体(的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(); 
    } 
} 
+0

我试图调用context.SaveChanges()也可以改变没有反映回来。有几个程序不承诺自己。 –

+0

@Surender - 我更新了一个事务示例。 – nekno

+0

非常感谢! –

0

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

+0

我通过更新功能导入。一些sp正在提交交易。有些不是提交的。 有没有什么办法我可以从实体框架提交我的数据库。 –

0

当你拿出你的数据库的数据到您的背景下,数据被保存在内存中,从实际的数据库本身是分开的。

您将会看到的变化,如果你创建一个新的上下文对象实例,并从它的数据库加载数据。

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

+0

我只通过函数导入进行更新。 如何使用更新的数据刷新上下文。 –

+0

编辑我的问题!请帮忙! –

+0

@Surender - 后您调用保存功能,检索功能将返回填充了更新数据的对象。我会确保你的堆栈以​​正确的顺序调用函数。如果您使用的是Ajax,请确保您没有看到缓存的响应。此外,请确保在保存功能成功完成之后才能调用检索功能。 –

0

添加到您的连接字符串(假定SQL 2005)

交易绑定=显式取消绑定;

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

相关问题