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