2011-06-28 51 views
3

爲了解SubSonic 3最近(極端)性能問題,我們希望遷移ORM,最好是儘可能少地重寫代碼(主要是Linq)。Linq的BLToolkit - 爲什麼需要使用`using`語句?

所以我在看BLToolkit。我在SubSonic和BLToolkit之間看到的主要區別之一是BLToolkit總是需要一個using聲明。例如:

static void SingleTableTest() 
{ 
    using (var db = new NorthwindDB()) //This 
    { 
     var query = 
      from e in db.Employee 
      where e.EmployeeID > 5 
      orderby e.LastName, e.FirstName 
      select e; 

     foreach (var employee in query) 
     { 
      Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName); 
     } 
    } 
} 

這到底是什麼?當你創建一個新的數據庫實例時,它是否會創建一個新的連接?將這個「包裹」到靜態類中是否合理,以便我可以從任何地方執行var q=from e in Database.Employee ...?這對Web應用程序的上下文有什麼影響?

+1

它與連接應該被限制在可能的最小工作單元的想法有關。我對這個框架並不熟悉,但很可能他們很像EF或LinqToSql那樣管理你的連接。 –

+0

根據我對代碼的看法,每個'new db'語句都有一個新的連接。我查看了SubSonic,他們使用了自制的「SharedConnectionScope」,以便自動打開和關閉連接。 – Earlz

+0

這可能會每次都創建一個數據庫連接對象的新實例,但它不應該創建到數據庫服務器的全新網絡連接。 .NET默認情況下會執行連接池。 –

回答

4

我猜你的例子中的NorthwindDB類是基於DbManager。 DbManager是Connection的一個包裝,它的行爲就像一個連接。你應該嘗試另一個類--DataContext。它的設計完全適合您的場景。

+0

有沒有辦法讓T4模板(包含在BLtoolkit中的模板)生成一個類似於DbManager擴展的擴展DataContext? – Earlz

+0

在你的模板中只需添加BaseDataContextClass =「DataContext」;在LoadMetadata()之前;/GenerateModel(); –

0

我不知道BLToolkit,但從您的評論中說,你想知道是否有可能每個HTTP請求使用一個對象,像Entity Framework這樣的東西。不是使用using語句,而是在global.asax的Application_BeginRequest事件中創建一個db對象。你在Application_EndRequest中處理它。您可以將對象存儲在HttpContext.Current.Items中,這是一個方便的每個請求集合。

正如我所說我不知道​​這是否適用於BLToolkit具體,因爲我不知道任何關於它,但希望它足以指出你在正確的方向。 :)

+0

好吧,它看起來像你可以做到..也許。問題只在於它保持SqlReader的打開狀態。我可能試試更好的運氣,看看是否有什麼突破 – Earlz

相關問題