【问题标题】:Multiple/single instance of Linq to SQL DataContextLinq to SQL DataContext 的多个/单个实例
【发布时间】:2010-09-18 13:47:36
【问题描述】:

我有一个项目,其中有许多不同的类查询和修改一组通用表中的数据。我已经建立了一个 .dbml 文件,它为我们提供了一个 DataContext 类。我的问题是 DataContext 的单个实例是否应该被所有对象使用,或者多个实例是否可以安全使用。我还想知道在单个 DataContext 的情况下的线程安全性,以及是否应该同步对其方法的访问。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    Rick Strahl 有一篇关于您的选择的好文章:http://www.west-wind.com/weblog/posts/246222.aspx

    另请参阅:LINQ to SQL - where does your DataContext live?

    您可能希望为每种类型的部署采用稍微不同的策略 - Web、桌面、Windows 服务...

    总之,您的选择是:

    • Global DataContext - 在多线程环境(包括 Web 应用程序)中很危险。请记住,不能保证实例成员是线程安全的(来自上文 Bradley Grainger 的 answer)。
    • 每个线程的DataContext - 复杂。如果您的 DataContext 正在跟踪更改,您必须确保在适当的时间刷新它们。实例化、存储和检索 DataContext 很麻烦。
    • 每个原子操作的 DataContext - 您将失去跟踪更改的能力,因为一个 DataContext 创建一个对象,而另一个 DataContext 更新或删除它。将数据对象附加到新的 DataContext 可能不会像您预期的那样工作。
    • 每个数据对象的 DataContext - 看起来不优雅,因为您必须在实例化(创建和附加)和更新/删除(将其从数据对象中拉出并使用它)时对 DataContext 大惊小怪。

    我为每个数据对象选择了一个 DataContext。它可能不是最好的解决方案,但它适用于所有部署环境。

    【讨论】:

      【解决方案2】:

      我为每个事务使用一个新的 DataContext 实例。

      重用旧实例可能会很麻烦,并且会使 DataContext 的内容膨胀,因为必须跟踪在某个时间加载的任何项目 - 您的应用程序会变得越来越慢,从而导致内存膨胀。

      如果您需要一个比事务更长的项目,您可以通过克隆该项目将其从 DataContext 中分离出来,然后可以使用 Attach() 将其重新附加到新的 DataContext。
      我什至可以克隆一个项目,使用 WCF 通过网络发送它,在稍后的调用中将其取回,将其附加到新的 DataContext 并保存更改(当然我需要一个时间戳列)。

      【讨论】:

        【解决方案3】:

        DataContext 类足够轻量级,您可以反复实例化它。当在单个方法中访问实体对象时,这使得事情变得更简单。如果您需要从不同的类和方法访问相同的 LINQ 对象,同时将它们附加到 DataContext 以进行跟踪,也可以保留单个实例。

        【讨论】:

          【解决方案4】:

          使用单个数据上下文对象的问题是,如果您向它的队列添加了一些更改,并且只想对 一些那些排队的更改。

          这就是我为每个类使用数据上下文对象的原因——我的User 类有它自己的数据上下文,我的Application 类有它自己的,等等。

          这种模式消除了在我的项目中进行回滚的大部分麻烦。

          【讨论】:

            【解决方案5】:

            我一直听说您应该使用 DataContext 的单个实例。我通常在我的业务逻辑类中创建我的 DC 的单例实例,并将它用于我的所有 linq 查询。

            我相信这里的一些 linq 专家可能会给你确切的理由,说明为什么你应该只在你的数据上下文类的实例上使用......我不太确定。

            【讨论】:

            • 那是模糊和迷信的。您能否更具体地说明您采用这种方法的原因?
            • 我总是听到完全相反的声音。 DataContexts 旨在尽可能短,以尽量减少并发问题。
            猜你喜欢
            • 2010-09-19
            • 2011-06-22
            • 1970-01-01
            • 2012-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-06
            相关资源
            最近更新 更多