更改 LINQ DataContext 的默认 CommandTimeout






4.96/5 (18投票s)
本文展示了一种更改 DataContext CommandTimeout 默认值的方法。
引言
有时,执行 LINQ to SQL 查询可能需要更长的时间,并超过 DataContext
类的 CommandTimeout
属性的默认值。 以下文章将介绍一种为您的 DataContext
类实现应用程序范围内的 CommandTimeout
的方法。
问题
调用长时间运行的数据库查询/存储过程的 LINQ to SQL 代码最终会遇到 System.Data.SqlClient.SqlException
:超时已过期异常。
解决方案
DataContext
类的 CommandTimeout
的默认值设置为 30 秒。 任何需要超过 30 秒才能完成的数据库查询都将抛出 System.Data.SqlClient.SqlException
:超时已过期异常。
此问题的一个解决方案是在每次创建 LINQ to SQL DataContext
对象并调用此类查询之前设置 CommandTimeout
的值。 但是,这种方法的问题在于,它会引入代码重复和相关问题。
我们实际上希望能够更改 CommandTimeout
属性的默认值,并且我们希望有效地做到这一点。 幸运的是,Visual Studio 2008 自动生成的 DataContext
子类提供了一种简单的方法,可以使用通过部分方法的扩展性来实现此目标。
C# 代码
通常,自动生成的 DataContext
子类有一些部分方法声明,如下所示
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
//Other DataContext specific methods
#endregion
我们对这里名为 OnCreated()
的方法感兴趣。 如果您查看 DataContext
子类的构造函数,您会注意到此部分方法在最后从构造函数的所有重载版本中调用。
对于那些不熟悉部分方法的人,请 查看此 MSDN 文档。 简而言之,部分方法被定义为类中的扩展点。 因此,如果除了该部分方法的声明之外没有其他定义 [在另一个部分类中],则该调用将被忽略。 但是,如果存在实现,它将被作为常规方法调用。
因此,我们将在另一个部分类中定义 OnCreated()
方法的主体,该部分类的完整名称与自动生成的类的完整名称相同,并在其中设置所需的超时值,如下所示
partial class SampleDBDataContext : System.Data.Linq.DataContext
{
partial void OnCreated()
{
//Put your desired timeout here.
this.CommandTimeout = 3600;
//If you do not want to hard code it, then take it
//from Application Settings / AppSettings
//this.CommandTimeout = Settings.Default.CommandTimeout;
}
}
就是这样! 这很简单,因为
DataContext
类的客户端不需要关心CommandTimeout
值,保持沉默。- 更改仅在一个地方,这意味着没有代码重复。
- 将此方法放在部分类中的单独文件中,确保即使自动生成的类在 DBML 文件发生更改时可能被覆盖,此更改也将保留。
历史
- 2008 年 5 月 22 日:初始发布