2011-08-05 42 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)

交易綁定=顯式取消綁定;

如果會話重置後數據不再可用,那麼問題確實與事務有關,如果數據在重置後可用,那麼您的問題有所不同,我們可能需要更多的細節。

相關問題