2012-06-13 98 views
0

我的同事幫助我在c#中開始編程,雖然我沒有經驗,但我喜歡它。一切都很順利,直到我遇到了一些我們都無法解決的問題。他自己使用SQL,但是用LINQ開始了我。刷新LINQ數據庫連接對象

做一個LINQ查詢我使用這個對象:_oDBConnection(in clsApplication.cs) 所以當打開程序時,這個對象是建立的。但它會產生一些問題:

  • 當保存一個新對象(將數據放入表中)時,我無法在查詢中加載這些值。我需要重新啓動程序。
  • 當運行PROGRAMM的2個實例,在其他變化時,一個是沒有得到的最​​新值(但它正顯示出新的,但沒有改變的!)

針對這些問題,我可以只能得出結論,當我第二次調用clsApplication._oDBConnection.tblTAl時,它不會再次重新連接到數據庫,而是將舊的db狀態返回給我。

這是他建立了代碼:

public static DBReservationDataContext _oDBConnection; 
private static frmMain _fMain; 
public clsApplication() 
{ 
    Thread.CurrentThread.Name = "main"; 
    clsErrorLog.ErrorLocation = "C:\\Software\\ErrorLog"; 
    clsErrorLog.setPassword("*****"); 
    clsErrorLog.LockApplication += new clsErrorLog.dLockApplication(lockApplication); 

    _oDBConnection = new DBReservationDataContext(); 

    _fMain = new frmMain(); 
    _fMain.Show(); 
} 

我能做些什麼來解決這個問題?

實施例:

雖然存在於數據庫中,在該查詢,因爲與ID的實體==沒有找到IID崩潰。但是iID是正確的,它確實存在於數據庫中。該查詢將關閉並重新啓動該程序後工作。然後再次調用clsApplication。提前

public clsReservationDetail(int iID) 
    :this() 
{ 
    _oReservationDetail = (from oReservationDetailQuery in clsApplication._oDBConnection.tblReservationDetails 
      where oReservationDetailQuery.ID == iID 
      select oReservationDetailQuery).First(); 
} 

THX

+0

「public static DBReservationDataContext _oDBConnection;」沒有。不,不,不,不。不,不!使用每個datacontext實例來完成一個工作單元。然後處理它(因爲它實現了IDisposable)併爲下一個工作單元創建一個新的工作單元。 –

回答

0

你的數據上下文將有一個Refresh方法,它會清除任何緩存的結果,而應該讓你的查詢,沒有任何問題

0

static關鍵字使得它,以便完成每個AppDomain都有一個參考。這是使用DataContext實例的錯誤方法。

DataContext的每個實例都會跟蹤它所看到的對象。這是爲了一致。如果您從一個查詢中獲得CustomerID = 4的Customer實例,則應該從另一個返回CustomerID = 4記錄的查詢中獲取相同的客戶實例的

如果你想看到在數據庫中更改,必須

1)告訴DataContext的停止跟蹤更改。這必須在第一個查詢之前完成,並使datacontext實例無法到SubmitChanges(因爲它不能跟蹤它們)。

OR

2)告訴它Refresh每次你懷疑實例已更改DataContext的。如果你這樣做,你應該指定如何解決你的本地更改和遠程更改之間的衝突 - 解決此衝突最簡單的方法是沒有本地更改。

OR

3)(正確的方法)創建一個新的DataContext實例,並與加載紀錄!

還要注意:由於DataContext的實現IDisposable您需要調用Dispose當你與每個實例甚至當異常發生完成。 using塊是實現這一目標的好方法。