2009-05-22 77 views
3

我讀了Rick Strahl的article瞭解如何處理數據上下文。我的DBML位於類庫內部,通過在庫中單獨的自定義部分類中創建靜態Current方法來保持我的數據上下文打開。Linq to SQL DataContext生命週期管理問題

public partial class DataContext 
{ 
    public static DataContext Current 
    { 
     get 
     { 
      DataContext dc = HttpContext.Current.Items["dc"] as DataContext; 
      if (dc == null) 
      { 
       dc = new ImmediacyPageDataContext(); 
       HttpContext.Current.Items["dc"] = dc; 
      } 

      return dc; 
     } 
    } 

然後訪問它像這樣

DataContext dc = DataContext.Current; 

然而,這導致無論何時更新我的​​DBML文件的問題。編輯完DBML文件後,每當我嘗試構建項目時,我的設計器文件不會重新生成/被刪除。如果我嘗試運行自定義工具選項,它會返回一個錯誤。

我可以避開這個問題的唯一方法是重新命名或刪除自定義部分類,重新生成設計器文件,然後將我的自定義部分類回液。這是一項工作,但是......它有點痛苦。

是否有更好的方法來取,這將使編輯我的DBML文件更容易,同時延長我的DC,只要可能嗎?

回答

5

使用部分DataContext類轉到代碼文件並將使用語句移動到您的名稱空間中。出於某種原因,除非是這種情況,否則該工具不會生成設計者。

namespace MyNamespace 
{ 
    using System; 
    using System.Data.Linq; 
    using System.Data.Linq.Mapping; 
    using System.Reflection; 
    using System.Xml.Linq; 

    partial class DataContext 
    { 
    } 
} 

我相信這個改變是從VS2008轉移到VS2008 SP1所必需的,不過我可能會混合一些版本。

3

您應該在不同的文件中創建您的部分類,而不是.designer.cs文件。最簡單的方法是右鍵單擊解決方案資源管理器中的DBML(或DBML設計器中的空白區域),然後單擊「查看代碼」。這將創建一個新的.cs文件,在保存DBML時不會被覆蓋。

+0

忘了提及部分類是在一個單獨的文件。 – 2009-05-22 16:18:41

+0

如果您將部分文件命名爲MyContext.partial.cs(而不是MyContext.cs,它將與主MyContext.dbml的名稱相匹配),那麼IDE將不會將您的部分文件與主dbml文件相關聯,並且您然後可以用任何你喜歡的方式格式化代碼。 – 2009-08-22 05:33:51

3

我不相信你的DataContext持久性和DBML問題有關。這聽起來像是IDE混淆了與緩存DataContext的衝突(HttpContext.Current.Items是每個請求,所以不存在長期緩存)。

當我的數據模型包含與另一個類衝突的類名時,我無法使用DBML編譯。例如,名爲'Application'(保險應用程序)的DBML對象可能與HttpApplicationState.Page.Application衝突。

檢查您的錯誤消息,看看它是否特定於您的DBML中的名稱。

0

我想不出爲什麼你的新靜態屬性必須是DataContext類的一部分,這是過分引人注目的原因。在不同的課堂上學習會很容易。