2012-10-13 78 views
1

每個應用程序只有一個DataContext並通過單例分享它可以嗎?Linq和DataContext

我問這是因爲我想在每種形式都有DataContext,但是我意識到,如果我在一個DataContext中更改某些實體,我將ro刷新它,如果以前使用過。

如Form1中:

db = GetContext() 
item=(from p in db.Table where p.id=1 select p) 

另一種形式的

db = GetContext() 
item=(from p in db.Table where p.id=1 select p) 
item.value="test" 

回原來的形式我必須做

db.Refresh(RefreshMode.OverwriteCurrentValues, item) 

即使我做了新的

item=(from p in db.Table where p.id=1 select p) 

(不刷新)值不會更新

是DataContext線程安全嗎?

回答

2

這是不行使用DataContext作爲單時,DataContext使用裏面的內部緩存工作模式的單位執行,內部緩存的目的是爲了避免往返數據庫和更改跟蹤。將DataContext保存爲單例會使內部緩存增加,並且暫時導致內存泄漏。

最佳實踐是的DataContext的壽命應爲每線程,大多數IoC容器的支持這一點,只是選擇一個和使用。

DataContext是不是線程安全的,所以想必你使用靜態構造函數或Lazy<>

+0

感謝的對你的答案(Jon和Coung)實施THEAD安全單身。我知道我現在不會做什麼:) –

2

如果每個應用程序只有一個DataContext並通過單例共享,那麼可以嗎?

嗯,這肯定不是它的設計 - 如果你有多個線程執行多個操作,肯定不會是一個好主意。

就像數據庫連接一樣,最好在需要時創建上下文,做你需要做的任何事情,然後當你有一組新的操作執行時創建一個新的上下文。