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 个问题:

  1. 这是一个好的架构吗(就使用 Linq 到 SQL 的数据访问而言)?
  2. 这个异常的原因是什么?

谢谢。

分析

最可能的问题原因是DataAccessLayerclass的一个实例(即DataContext的一个实例)被多个线程使用(异步执行).但是 DataContext Class 的实例成员不保证是线程安全的。

解决方案

可能的解决方案之一:考虑为每个异步调用创建一个 DataAccessLayer class 的新实例。

备注

另外,请在适当的时候调用DatabaseDataContextDispose()方法:DataAccessLayer class应该实现IDisposable接口。