实体框架Core ObjectDisposeException:“安全句柄已关闭”

时间:2017-04-07 06:57:32

标签: sqlite entity-framework-core objectdisposedexception

设置

实体框架核心1.1

WPF应用程序.NET 4.5.2

问题:

我在sqlite数据库上运行查询时有时会遇到此异常。

  

发生System.ObjectDisposedException HResult = 0x80131622
  Message =安全句柄已关闭Source = mscorlib StackTrace:
  在System.Runtime.InteropServices.SafeHandle.DangerousAddRef(布尔&   成功)   System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle,   布尔和放大器;成功)   Microsoft.Data.Sqlite.Interop.NativeMethods.Sqlite3_sqlite3.sqlite3_db_filename(Sqlite3Handle   db,IntPtr zDbName)at   Microsoft.Data.Sqlite.Interop.NativeMethods.Sqlite3_sqlite3.db_filename(Sqlite3Handle   db,IntPtr zDbName)at   Microsoft.Data.Sqlite.Interop.NativeMethods.sqlite3_db_filename(Sqlite3Handle   db,String zDbName)at   Microsoft.Data.Sqlite.Interop.VersionedMethods.Strategy3_7_10.GetFilename(Sqlite3Handle   db,String zDbName)at   Microsoft.Data.Sqlite.Interop.VersionedMethods.GetFilename(Sqlite3Handle   db,String zDbName)at   Microsoft.Data.Sqlite.SqliteConnection.get_DataSource()at   Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Close()
  在   Microsoft.EntityFrameworkCore.Storage.Internal.SqliteRelationalConnection.Close()   在   Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.Dispose()   在   Microsoft.EntityFrameworkCore.Query.QueryMethodProvider< _ShapedQuery> d__3 1.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()
  在   Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor 1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)at at   FxConnection.Persistence.Repositories.PointNameRepository.GetConnectedDeviceNoTracking(PointName   pointName)在C:\ Users * \ documents \ visual studio中   2017年\项目\项目\项目\持久性\库\ PointNameRepository.cs:行   357 at   FxConnection.ViewModels.ProjectDeviceDatabaseViewModel.InitialLoading_DoWork(对象   发件人,DoWorkEventArgs e)在C:\ Users * \ documents \ visual studio中   2017年\项目\项目\项目\的ViewModels \ ProjectDeviceDatabaseViewModel.cs:行   1729年   System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
  在System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object   参数)

我在循环中运行的查询,在循环之前创建了新的上下文。

DatabaseContext.Devices.Load();
var deviceFrom =
    DatabaseContext.SocketSockets.AsNoTracking()
        .Include(i => i.SocketFrom)
        .Where(ss => ss.SocketTo.PointNameId == pointName.PointNameId)
        .Select(s => s.SocketFrom)
        .Where(s => s.IsConnected || s.IsSupplyOrGround == false)
        .Select(s => s.Device)
        .ToList();

var deviceTo =
    DatabaseContext.SocketSockets.AsNoTracking()
        .Include(i => i.SocketTo)
        .Where(ss => ss.SocketFrom.PointNameId == pointName.PointNameId)
        .Select(s => s.SocketTo)
        .Where(s => s.IsConnected || s.IsSupplyOrGround == false)
        .Select(s => s.Device)
        .ToList();

我想知道我是否以正确的方式进行查询?因为有时候完全有可能没有结果。这可能是个问题吗?

此外,我的SocketSocket表基本上是包含Socket对的多对多映射。

即使使用相同的数据,问题也不会一直发生在同一地点。

  • 尝试让多个上下文同时访问同一个sqlite数据库会导致此异常吗?

0 个答案:

没有答案