Linq to sql Linq to SQL:每个页面都有一个小的DataContext好还是一个全局的好?

Linq to sql Linq to SQL:每个页面都有一个小的DataContext好还是一个全局的好?,linq-to-sql,Linq To Sql,我正在ASP.NET应用程序中试用Linq to SQL,该应用程序使用一个包含大量外键(100多个表)的大型数据库。我对Linq如何允许您创建一个保持所有关系完整的datacontext,然后创建自动连接表的Linq语句印象深刻。但是,这导致了一个问题:如果我提交的Linq语句仅适用于一个或两个表,那么使用一个只包含必要表的datacontext是否更好?在我看来,如果我用数据库中的所有表构建一个datacontext,它将非常庞大,并且每次使用Linq时加载它都会对性能产生负面影响。我说得对

我正在ASP.NET应用程序中试用Linq to SQL,该应用程序使用一个包含大量外键(100多个表)的大型数据库。我对Linq如何允许您创建一个保持所有关系完整的datacontext,然后创建自动连接表的Linq语句印象深刻。但是,这导致了一个问题:如果我提交的Linq语句仅适用于一个或两个表,那么使用一个只包含必要表的datacontext是否更好?在我看来,如果我用数据库中的所有表构建一个datacontext,它将非常庞大,并且每次使用Linq时加载它都会对性能产生负面影响。我说得对吗


注释:我知道只在需要时创建datacontext(但是感谢您的提及)。问题是我是否应该有很多小的DataContext,或者是否可以构建一个大的DataContext。

这一页(见迷思10)说最好使用短期的DataContext实例。

我认为数据上下文非常轻量级,大部分只是容器。在查询数据之前,数据不会实际加载到上下文中。我不认为拥有一个单一的数据上下文是错误的,而只是根据需要(作为一个工作单元)实例化它,而不是一直保持它。这样,你就不会有一个长寿命的物体会继续变得越来越大

如果您的表可以被划分为相关的表组,那么您可能需要考虑为这些组中的每一个都有一个单独的数据上下文。我不确定LINQ将如何使用来自多个上下文的数据处理查询,但似乎只要表位于同一服务器上,它就应该工作。如果确实将内容分解为多个上下文,并且查询需要来自多个上下文的表,则必须检查此项


通常我使用单个上下文并根据需要对其进行实例化,但我没有任何数据库像您的数据库那样大。

每个连接的表组应该有一个DataContext。在大多数应用程序中,这意味着所有内容都只有一个DataContext。如果恰好有几组表不需要一起修改,则可以考虑几个DATACONTEX。如果您甚至需要跨数据上下文进行查询,请不要将它们分开

DataContext不仅仅是一组表——它是数据网关模式的实现——您可以用返回所需数据的方法填充它,这样您就不必将查询硬编码到应用程序的每个角落。现在,如果您有多个DataContext,每页一个,那么您很可能最终不得不在每个DataContext中都使用您的通用功能(想想MyDataContext.GetActiveCustomers())。这将是可怕的重复

所以答案是,构建许多小型数据上下文通常是不合适的。只有当您的数据是完全独立的(不同的逻辑或物理数据库),或者您只是将DataContext用作一个连接对象时,这才是可行的


但是请注意,DataContext应该是短期的——它们是工作单元模式的实现,因此它们的生命周期应该等于一个逻辑操作(例如加载一组产品或插入一个新订单)。创建和销毁数据上下文的成本很低,所以不要浪费时间缓存它们,因为。

我在我们的数据库上做了一个测试,它有大约600个表。首先,我将它们分为9个离散的数据上下文,每个上下文都非常易于管理。然后,我编写了一个脚本,对其中一个进行了数百次选择、更新和删除(在每次访问之后都处理datacontext,这样LINQ就必须为每次访问重新创建datacontext)

然后我制作了另一个datacontext,上面有所有600个表,并运行了相同的测试


结果几乎相同。我的结论是,较小的数据上下文不会带来性能提升。当然,使用来自单个datacontext的实体要容易得多(但不是在designer视图中——呸!)。

感谢您的回答,尤其是10个神话文章的链接(linq?)。这是非常有帮助的。+1-谢谢你做了所有的工作!我最终没有使用LINQ,但我仍然很感激这些答案。