2011-04-14 22 views
2

我試圖找到一種方法來從實體內部提供DataContext。在檢索到實體實例後設置DataContext

我想要做這樣的事情:

partial public class MyEntity 

    public DataContext as MyDataContext 

    private sub OnLoaded() 
     Me.DataContext = <the context that retrieved this instance> 
    end sub 

end class 

首先,可以像這樣做呢? 其次,假設我不打算將此實體與任何其他DataContext一起使用,那麼在做這樣的事情時是否存在任何危險或陷阱?

這是我做它目前的方式:

partial public class MyDataContext 

    public function GetMyEntity(byval id as integer) as MyEntity 
     dim o = MyEntities.SingleOrDefault(function(e) e.id = id) 
     if o isnot nothing then o.DataContext = Me 
     return o 
    end function 

end class 
+1

爲什麼你需要那個?爲什麼你需要每個實體的數據上下文? – jaraics 2011-04-19 05:54:28

+0

一般來說,這似乎是不必要的,並且可能有更好的方法來做任何你想做的事情。如果您提供對您的方案更詳細的描述,這將有所幫助。取決於您計劃如何使用此係統,可能存在一些問題。據我所見,你有一個Web應用程序(在評論中引用「HttpContext」)。想到的一件事是,如果您使用每個請求或更短的上下文壽命,但是,比如說將實體存儲在緩存中並嘗試稍後檢索並使用它們 - 您將會遇到第一個問題。如果你描述你的場景,我可以嘗試多想一想。 – Yakimych 2011-04-21 17:33:08

+0

我不想緩存任何東西。我確切地說我想在問題中做什麼。我只是想要(從一個實體實例中)引用到檢索它的數據上下文。正如我在其他評論中所說的,數據上下文的生命週期不會超過Web請求。 – 2011-04-21 23:48:04

回答

1

你可以在DataContext的使用Singleton模式,但你需要某種形式的生命週期管理的就可以了,因爲它不是很好的保持它周圍很長。 (請求結束處理它也許)

在C#中的示例,但我希望你能理解它。

public class MyDataContext 
{  
    public static MyDataContext Current 
    { 
     get 
     { 
      MyDataContext context = (MyDataContext)HttpContext.Current.Items["Context"]; 
      if(context == null) 
      { 
       context = new MyDataContext(); 
       HttpContext.Current.Items["Context"] = context; 
      } 
      return context; 
     } 
    } 
} 

public class MyEntity 
{ 
    public MyDataContext DataContext 
    { 
     get{ return MyDataContext.Current;} 
    } 
} 

在Global.asax中,你可以掛鉤的事件Application_EndRequest並調用MyDataContext.Current.Dispose();處置上下文的手動,而不是等待GC做到這一點。

+0

我沒有考慮把它放在HttpContext中。那是什麼壽命?除了訪問請求或會話外,我從來沒有使用過它。 – 2011-04-17 19:41:16

+0

當請求結束時它將結束。所以它非常短 – Magnus 2011-04-17 19:53:27

+0

有沒有辦法讓每個實體都有一個基類實體? – 2011-04-17 21:55:57

2

你雖然沒有爲它指定一個真正的原因,只是a sidenote from MSDN

一般來說,DataContext實例 設計壽命爲一個「 工作單位」但是你的應用程序定義 那術語。 A DataContext是 輕量級,並且對 創建並不昂貴。典型的LINQ to SQL 應用程序會在方法範圍創建DataContext 實例或將其作爲 代表相關 數據庫操作的邏輯集合的012h成員。

和一個more

不要嘗試重用的 DataContext實例。每個DataContext 保持一個特定編輯/查詢會話的狀態(包括標識 緩存)。要基於數據庫的當前狀態獲取基於 的新實例,請使用新的DataContext

最後,

...任何實例成員不 保證線程安全的。

但仍然在某些情況下,半持久性解決方案可能會非常有幫助。看一看Rick Strachl的文章:Linq to SQL DataContext Lifetime Management。有不同的方法DataContext管理審查中。對他們 - 創建每個業務對象DataContext正是你所需要的。

+0

我對數據上下文的使用非常短暫。通常只有Web請求的生命週期。我可以隨時創建一個新實例,但我需要從所有對象(主要是因爲身份緩存)訪問相同的上下文。 – 2011-04-21 20:14:02