我有一个项目,其中包含许多不同的类,这些类在一组通用表中查询和修改数据。我已经设置了一个.dbml文件,它为我们提供了一个DataContext类。我的问题是,是否应该由所有对象使用DataContext的单个实例,或者是否可以安全使用多个实例。我也想知道单个DataContext的线程安全性,以及是否应同步访问它的方法。
答案 0 :(得分:33)
Rick Strahl有一篇关于你的选择的好文章:http://www.west-wind.com/weblog/posts/246222.aspx。
另请参阅:LINQ to SQL - where does your DataContext live?。
对于每种类型的部署,您可能需要略有不同的策略 - Web,桌面,Windows服务......
总结,您的选择是:
我为每个数据对象选择了一个DataContext。它可能不是最好的解决方案,但它适用于所有部署环境。
答案 1 :(得分:9)
我为每个事务使用一个新的DataContext实例。
重用旧实例可能很麻烦,并且会使DataContext的内容膨胀,因为必须跟踪任何已经加载的项目 - 您的应用程序将变得越来越慢,内存膨胀。
如果您需要的项目长于事务,则可以通过克隆项目将其从DataContext中分离出来,然后可以使用Attach()将其重新附加到新的DataContext。
我甚至可以克隆一个项目,通过网络通过WCF发送它,稍后再调用它,将它附加到一个新的DataContext并保存更改(当然我需要一个时间戳列)。
答案 2 :(得分:8)
DataContext类足够轻量级,您可以反复实例化它。这使得在单个方法中访问实体对象时更简单。如果您需要从不同的类和方法访问相同的LINQ对象,同时将它们连接到DataContext以进行跟踪,那么保留单个实例也是可以的。
答案 3 :(得分:3)
使用单个数据上下文对象的问题是,如果您对其队列添加了一些更改,并且想要在某些上进行回滚,则可能会遇到麻烦那些排队的变化。
这就是我为每个类使用数据上下文对象的原因 - 我的User
类拥有自己的数据上下文,我的Application
类拥有它自己,等等。
这种模式消除了我项目中回滚的大多数麻烦。
答案 4 :(得分:-3)
我一直听说你应该使用DataContext的单个实例。我通常在业务逻辑类中创建DC的单例实例,并将其用于我的所有linq查询。
我确信这里的一些linq专家可能会告诉你为什么你应该只有你的数据上下文类的实例......我不太确定。