从 EF 6.1.3 更新到 EF 6.2.0 导致无法访问处置对象错误
Updating to EF 6.2.0 from EF 6.1.3 causes cannot access a disposed object error
我正在使用 SQLite。我可以在我的 WPF 应用程序中毫无问题地使用 entity framework 6.1.3,但是当我将它更新到 6.2.0 时,出现以下错误:
Test method DataAccessLayerTests.GenericDataRepositoryTests.CRUD_On_Pipe threw exception:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'SQLiteConnection'.
at System.Data.SQLite.SQLiteConnection.CheckDisposed()
at System.Data.SQLite.SQLiteConnection.get_State()
at System.Data.Entity.Internal.RepositoryBase.CreateConnection()
at System.Data.Entity.Migrations.History.HistoryRepository.QueryExists(String contextKey)
at System.Data.Entity.Migrations.History.HistoryRepository.Exists(String contextKey)
at System.Data.Entity.Migrations.History.HistoryRepository.GetPendingMigrations(IEnumerable`1 localMigrations)
at System.Data.Entity.Migrations.DbMigrator.GetPendingMigrations()
at Core.DatabaseContext.CreateAndSeedIfNotExists`1.InitializeDatabase(T context) in C:\Users\roadrunner\propulsimcs\Propulsim\Core\DatabaseContext.cs:line 40
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e()
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Database.Initialize(Boolean force)
at Core.DatabaseContext..ctor() in C:\Users\roadrunner\propulsimcs\Propulsim\Core\DatabaseContext.cs:line 114
at DataAccessLayer.GenericDataRepository`1.GetAll(Expression`1[] navigationProperties) in C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayer\GenericDataRepository.cs:line 16
at DataAccessLayerTests.GenericDataRepositoryTests.CRUD_On_Pipe() in C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayerTests\GenericDataRepositoryTests.cs:line 34
Debug Trace:
Native library pre-loader is trying to load native SQLite library "C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayerTests\bin\Debug\x86\SQLite.Interop.dll"...
有什么想法吗?
问题是由 RepositoryBase
class 中的更改和 SQLiteConnection
class IDbConnection.State 属性 的不正确 (IMO) 实施引起的](在处置对象上调用时抛出 ObjectDisposedException
而不是返回 ConnectionState.Closed
)。
与#398: NullReferenceException on Code First Migrations when Glimpse is installed中的报道相同。根据状态,它已经修复在 EF6 存储库中,但不幸的是他们决定不提供补丁,所以你必须等待 v6.3。我已经报告了链接到此 post 的 SQLite 问题,希望他们能改变主意。
另一种选择是将问题报告给 SQLite development 并等待那里的修复。在这两种情况下,您都必须等待 SQLite 或 EF6 方面的修复。请注意,即使使用标准 MigrateDatabaseToLatestVersion
初始化程序也可以重现该问题。
我能够通过使用以下丑陋的反射 hack 来解决它:
public override void InitializeDatabase(T context)
{
base.InitializeDatabase(context);
var _historyRepository = migrator.GetType().GetField("_historyRepository", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(migrator);
var _existingConnection = _historyRepository.GetType().BaseType.GetField("_existingConnection", BindingFlags.Instance | BindingFlags.NonPublic);
_existingConnection.SetValue(_historyRepository, null);
var x = migrator.GetPendingMigrations();
if (x.Any())
{
migrator.Update();
Seed(context);
}
}
原来的异常消失了,但现在我收到另一个异常 '找不到提供程序 'System.Data.SQLite' 的 MigrationSqlGenerator。在目标迁移配置 class 中使用 SetSqlGenerator 方法注册额外的 SQL 生成器。' 我认为这是一个与 [=38 中缺少 MigrationSqlGenerator
有关的不同问题=]ite EF 服务。这可能是问题,也可能不是问题,具体取决于您在 6.1.3 中是如何解决的。
无论如何,我不推荐使用上面的 hack。等待 fox 修复或暂时降级到 6.1.3。
同样影响 GlimpseDB 的问题已修复:https://github.com/aspnet/EntityFramework6/pull/405
正在等待发布。
我正在使用 SQLite。我可以在我的 WPF 应用程序中毫无问题地使用 entity framework 6.1.3,但是当我将它更新到 6.2.0 时,出现以下错误:
Test method DataAccessLayerTests.GenericDataRepositoryTests.CRUD_On_Pipe threw exception:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'SQLiteConnection'.
at System.Data.SQLite.SQLiteConnection.CheckDisposed()
at System.Data.SQLite.SQLiteConnection.get_State()
at System.Data.Entity.Internal.RepositoryBase.CreateConnection()
at System.Data.Entity.Migrations.History.HistoryRepository.QueryExists(String contextKey)
at System.Data.Entity.Migrations.History.HistoryRepository.Exists(String contextKey)
at System.Data.Entity.Migrations.History.HistoryRepository.GetPendingMigrations(IEnumerable`1 localMigrations)
at System.Data.Entity.Migrations.DbMigrator.GetPendingMigrations()
at Core.DatabaseContext.CreateAndSeedIfNotExists`1.InitializeDatabase(T context) in C:\Users\roadrunner\propulsimcs\Propulsim\Core\DatabaseContext.cs:line 40
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e()
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Database.Initialize(Boolean force)
at Core.DatabaseContext..ctor() in C:\Users\roadrunner\propulsimcs\Propulsim\Core\DatabaseContext.cs:line 114
at DataAccessLayer.GenericDataRepository`1.GetAll(Expression`1[] navigationProperties) in C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayer\GenericDataRepository.cs:line 16
at DataAccessLayerTests.GenericDataRepositoryTests.CRUD_On_Pipe() in C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayerTests\GenericDataRepositoryTests.cs:line 34
Debug Trace:
Native library pre-loader is trying to load native SQLite library "C:\Users\roadrunner\propulsimcs\Propulsim\DataAccessLayerTests\bin\Debug\x86\SQLite.Interop.dll"...
有什么想法吗?
问题是由 RepositoryBase
class 中的更改和 SQLiteConnection
class IDbConnection.State 属性 的不正确 (IMO) 实施引起的](在处置对象上调用时抛出 ObjectDisposedException
而不是返回 ConnectionState.Closed
)。
与#398: NullReferenceException on Code First Migrations when Glimpse is installed中的报道相同。根据状态,它已经修复在 EF6 存储库中,但不幸的是他们决定不提供补丁,所以你必须等待 v6.3。我已经报告了链接到此 post 的 SQLite 问题,希望他们能改变主意。
另一种选择是将问题报告给 SQLite development 并等待那里的修复。在这两种情况下,您都必须等待 SQLite 或 EF6 方面的修复。请注意,即使使用标准 MigrateDatabaseToLatestVersion
初始化程序也可以重现该问题。
我能够通过使用以下丑陋的反射 hack 来解决它:
public override void InitializeDatabase(T context)
{
base.InitializeDatabase(context);
var _historyRepository = migrator.GetType().GetField("_historyRepository", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(migrator);
var _existingConnection = _historyRepository.GetType().BaseType.GetField("_existingConnection", BindingFlags.Instance | BindingFlags.NonPublic);
_existingConnection.SetValue(_historyRepository, null);
var x = migrator.GetPendingMigrations();
if (x.Any())
{
migrator.Update();
Seed(context);
}
}
原来的异常消失了,但现在我收到另一个异常 '找不到提供程序 'System.Data.SQLite' 的 MigrationSqlGenerator。在目标迁移配置 class 中使用 SetSqlGenerator 方法注册额外的 SQL 生成器。' 我认为这是一个与 [=38 中缺少 MigrationSqlGenerator
有关的不同问题=]ite EF 服务。这可能是问题,也可能不是问题,具体取决于您在 6.1.3 中是如何解决的。
无论如何,我不推荐使用上面的 hack。等待 fox 修复或暂时降级到 6.1.3。
同样影响 GlimpseDB 的问题已修复:https://github.com/aspnet/EntityFramework6/pull/405
正在等待发布。