System.ObjectDisposedException - 在 Using 块中使用 SQL 连接

System.ObjectDisposedException - Using SQL Connection within Using Block

System.ObjectDisposedException HResult=0x80131622 Message=Cannot access a disposed object. Object name: 'SQLiteConnection'.
Source=System.Data.SQLite

我编写了一个使用 Dapper 和 DapperExtensions 的简单存储库

尝试检索某些结果时,在视图模型的方法 returns 之后使用 Using 块时出现此错误。使用连接的 Open/Close 方法替换 Using 块时,我没有收到错误。感觉问题很简单,就是看不出来

我的 "base" 数据库存储库

using System.Data.SQLite;

namespace WpfApp1.Data
{
    public class SqliteBaseRepository
    {
        public static string DbFile
        {
            get { return @"D:\PROJECTS\test.db"; }
            //get { return Environment.CurrentDirectory + "\SimpleDb.sqlite"; }
        }

        public SQLiteConnection DbConnection()//dbconnection
        {
            return new SQLiteConnection("Data Source=" + DbFile);
        }
    }
}

通用存储库:

    public class Repository<TPoco, TDatabase> 
            where TPoco : class
            where TDatabase : SqliteBaseRepository, new()
        {

            private TDatabase DB = new TDatabase();

            public IEnumerable<TPoco> FindAll(object predicate=null)
            {
                IEnumerable<TPoco> result;
                using (var cnn = DB.DbConnection())
                {
                    //var cnn = DB.DbConnection();
                    cnn.Open();
                    result = cnn.GetList<TPoco>(predicate);
                }
                return result;
            }
        }

在我的视图模型的构造函数中,我在这里遇到错误:

public PartViewModel()
{
    var x = _PartRepository.FindAll();  //no error. There are results/data in here
    var y = new ObservableCollection<Part>(x); //error raised here
}

使用 Open/Close 而不是 Using 块不会产生错误:

public IEnumerable<TPoco> FindAll(object predicate=null)
                {
                    IEnumerable<TPoco> result;
                    var cnn = DB.DbConnection();
                    cnn.Open();
                    var result = cnn.GetList<TPoco>(predicate);
                    cnn.Close();
                    return result;
                }

您需要在 using 块内迭代结果:

using (var cnn = DB.DbConnection())
{
    //var cnn = DB.DbConnection();
    cnn.Open();
    result = cnn.GetList<TPoco>(predicate);
    result = result.ToList();  // fetch records now 
}
return result;

一个Linq查询是'lazy',实际的Db I/O被推迟了。在您的原始情况下,直到 after 您关闭了连接。