2012-02-16 48 views
1

我正在通过传递一个已经打开的连接来创建一个LINQ to SQL DataContext。这是有效的,除非我现在在各处泄漏连接,因为尽管我在完成时处理DataContext,但连接永远不会关闭。我明白这是设计。LINQ to SQL,重写处理

我想要做的是确保我的连接在我的DataContext被处置后关闭。

我试图重写处置的DataContext的,就像这样:

protected override void Dispose(bool disposing) 
{ 
    this.Connection.Close(); 
} 

然而,这并不工作...我得到的ObjectDisposedException。设置一个断点告诉我,在这一点上已经完成了一切!

我发现的唯一解决方法是在DataContext上隐藏Dispose方法。像这样:

public new void Dispose() 
    { 
     this.Connection.Close(); 

     base.Dispose(); 
    } 

但是,这对我来说有点不好的代码味道。推荐的方式是什么?

完整代码示例(DataClasses1DataContext是一个空的DataContext):

class Program 
{ 
    static void Main(string[] args) 
    { 
     string connectionString = "server=localhost;initial catalog=master;Integrated Security=SSPI;"; 

     for (int i = 0; i < 100; i++) 
     { 
      var connection = new SqlConnection(connectionString); 
      connection.Open(); 

      var ctx = new DataClasses1DataContext(connection); 
      ctx.ExecuteCommand("declare @i int"); 

      ctx.Dispose(); 
     } 

     Console.ReadKey(); 
    } 
} 

public partial class DataClasses1DataContext 
{ 
    protected override void Dispose(bool disposing) 
    { 
     // This will throw an ObjectDisposedException 
     // this.Connection.Close(); 
    } 

    public new void Dispose() 
    { 
     // This will work 
     // this.Connection.Close(); 

     //base.Dispose(); 
    } 
} 
+0

覆盖Dispose方法调用的异常是什么? – 2012-02-16 14:40:32

+0

我得到一个ObjectDisposedException – TheNextman 2012-02-16 14:41:38

+0

什么是ObjectDisposedException的消息? – jrummell 2012-02-16 14:48:06

回答

2

问题是调用Dispose(bool)之前Dispose()disposed。当您致电Connection时,会导致异常。似乎没有办法解决这个问题。我不得不问,为什么这是必要的? Dispose(bool)Provider上调用Dispose,其中包含Connection,并应自动关闭它。

+0

谢谢。从查看反射器看来,连接似乎只能在某些条件下处理(可能,如果首先由Linq打开SQL的话)。 – TheNextman 2012-02-16 17:24:55

+0

从表面上看,至少,似乎Linq to SQL没有公共提供者模型,我可以改变它。似乎我的解决方法是唯一的方法。 – TheNextman 2012-02-16 17:27:02

+0

@ TheNextman:你在使用'SqlProvider'吗?看来它应该总是关闭连接。除非我错过了'conManager'设置为'null'的地方(它是在分支之外构建的)。 – Guvante 2012-02-16 17:48:02