我通过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));
}
但是,直到我不浏览浏览器会话并再次运行它时,才会反映更改。
请帮忙!
提前谢谢
答案 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;
如果会话重置后数据不再可用,则问题确实存在于事务中,如果数据在重置后可用,那么您的问题会有所不同,我们可能需要更多详细信息。