LINQ TO SQL 在 WPF 应用程序中生成连接关闭异常,有时
LINQ TO SQL in WPF Application generating connection is closed exception, sometimes
我的 WPF(现代 UI)应用程序具有以下体系结构:
我有一个所有视图模型都继承自的 ViewModelBase
class。此 class 有一个名为 DataAccessLayer
的 属性,类型为 DataAccessLayer
。
DataAccessLayer class 有这样的定义:
public class DataAccessLayer
{
private readonly DatabaseDataContext _context;
public DataAccessLayer()
{
var connectionString = Settings.Default.DevelopmentConnectionString;
_context = new DatabaseDataContext(connectionString);
}
// Methods for calling procedures and functions using the _context field.
}
DatabaseDataContext
是 dbml class。
在我的视图模型中,每当我需要使用数据库时,我都会像这样使用 DataAccessLayer
属性:
private void DisplayQuotationData()
{
var quotationInfo = DataAccessLayer.Quotation_Info(QuotationId);
QuotationDate = quotationInfo.QuotationDate;
Entries = DataAccessLayer.proc_QuotationEntries(QuotationId).ToList();
}
这个方法是异步调用的。
我的问题是,有时(主要是在生产中)我收到错误:"Invalid operation. Connection is closed" 很多时候程序甚至崩溃。它不可重现,我不知道原因。我有 2 个问题:
- 这是一个好的架构吗(就使用 Linq 到 SQL 的数据访问而言)?
- 这个异常的原因是什么?
谢谢。
分析
最可能的问题原因是DataAccessLayer
class的一个实例(即DataContext
的一个实例)被多个线程使用(异步执行).但是 DataContext Class 的实例成员不保证是线程安全的。
解决方案
可能的解决方案之一:考虑为每个异步调用创建一个 DataAccessLayer
class 的新实例。
备注
另外,请在适当的时候调用DatabaseDataContext
的Dispose()
方法:DataAccessLayer
class应该实现IDisposable
接口。
我的 WPF(现代 UI)应用程序具有以下体系结构:
我有一个所有视图模型都继承自的 ViewModelBase
class。此 class 有一个名为 DataAccessLayer
的 属性,类型为 DataAccessLayer
。
DataAccessLayer class 有这样的定义:
public class DataAccessLayer
{
private readonly DatabaseDataContext _context;
public DataAccessLayer()
{
var connectionString = Settings.Default.DevelopmentConnectionString;
_context = new DatabaseDataContext(connectionString);
}
// Methods for calling procedures and functions using the _context field.
}
DatabaseDataContext
是 dbml class。
在我的视图模型中,每当我需要使用数据库时,我都会像这样使用 DataAccessLayer
属性:
private void DisplayQuotationData()
{
var quotationInfo = DataAccessLayer.Quotation_Info(QuotationId);
QuotationDate = quotationInfo.QuotationDate;
Entries = DataAccessLayer.proc_QuotationEntries(QuotationId).ToList();
}
这个方法是异步调用的。
我的问题是,有时(主要是在生产中)我收到错误:"Invalid operation. Connection is closed" 很多时候程序甚至崩溃。它不可重现,我不知道原因。我有 2 个问题:
- 这是一个好的架构吗(就使用 Linq 到 SQL 的数据访问而言)?
- 这个异常的原因是什么?
谢谢。
分析
最可能的问题原因是DataAccessLayer
class的一个实例(即DataContext
的一个实例)被多个线程使用(异步执行).但是 DataContext Class 的实例成员不保证是线程安全的。
解决方案
可能的解决方案之一:考虑为每个异步调用创建一个 DataAccessLayer
class 的新实例。
备注
另外,请在适当的时候调用DatabaseDataContext
的Dispose()
方法:DataAccessLayer
class应该实现IDisposable
接口。