2011-06-20 39 views
1

使用SQLSERVER 2008 R2,2010 VisualStudio的最佳實踐,.NET 4.0「服務器無法恢復交易」 - 使用LINQ to類

我得到這個時期的異常:「服務器無法恢復交易 - 說明2000003 「(數字變化)

閱讀在線論壇,在這裏,我發現主要的原因是正確實例並關閉連接。

我的課程應該是什麼樣子?

在Class級別創建DataContext並在所有方法上使用它?

public class BusProcess 
{ 

    RENDBDataContext db = new RENDBDataContext(); 

    public void Insert() 
    { 
     //Do stuff here... 
     db.InsertProcedure(...); 
    } 
} 

通過使用()在每個方法上創建和配置一個新的DataContext?

public class BusProcess 
{ 

    public void Insert() 
    { 
     using(RENDBDataContext db = new RENDBDataContext()) 
     { 
      //Do stuff here... 
      int sample = db.SomeObject.SingleOrDefault(...).Id; 
      db.InsertProcedure(...); 
     } 
    } 
} 

或者,也許不同的方法(最佳實踐)

回答

3

一般來說,DataContext實例的生命週期應該綁定到一個單獨的工作單位 - 這是你的第二個用途例證。

第一個用法也可以被罰款,這取決於封裝類是如何長壽 - 但無論出現的情況下,確保類實現IDisposable,在你執行Dispose()封閉DataContext處置,以及包裝用途的類與using()

+0

如果我使用SECOND示例,假設該方法返回一個IQueryable <>,那麼我將無法使用該數據,導致DataContext已經處理?而且:爲了處理DataContext,將它的變量設置爲null就足夠了。 –

+1

@Vitor:你說得對,返回的'IQueryable'將失敗,但你可以實現查詢(即調用'ToList'或'ToArray')並返回。簡單地將變量設置爲null對於實現'IDisposable'的類是不夠的:該接口的目的是在完成實例後立即調用Dispose()(例如通過'using')。否則,在GC收集對象(並調用其終結器)之前,其資源不會被清理。 –

1

第二種方法比始終使用DataContext要好。它會防止在調用Load等時消耗內存。還要記住連接是集中的,所以創建新的DataContext並不是什麼大問題。

1

兩者的組合。使用第一種方法,但讓你的類實現IDisposable並在你的類的dispose方法的上下文中調用dispose。然後你使用你的類來使用語句。您還可以在類的構造函數中傳入DataContext以增加靈活性。