2012-10-13 126 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并通过单例共享,那么可以吗?

嗯,这肯定不是它的设计 - 如果你有多个线程执行多个操作,肯定不会是一个好主意。

就像数据库连接一样,最好在需要时创建上下文,做你需要做的任何事情,然后当你有一组新的操作执行时创建一个新的上下文。