fer*_*rit 13 c# system.data.sqlite entity-framework-6
我正在使用SQLite.我可以在我的WPF应用程序中使用实体框架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"...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Iva*_*oev 10
问题是由RepositoryBase类的更改和类的不正确(IMO)实现IDbConnection.State属性引起的SQLiteConnection(抛出ObjectDisposedException而不是ConnectionState.Closed在调用disposed对象时返回).
它与安装Glimpse时#398:Code First Migrations上的NullReferenceException报告的相同.根据状态,它已经在EF6存储库中修复,但不幸的是他们决定不提供补丁,所以你必须等待v6.3.我已经报告了链接到这篇文章的SQLite问题,所以希望他们可以改变主意.
另一个选择是将问题报告给SQLite开发并从那里等待修复.在这两种情况下,您都必须等待SQLite或EF6端的修复.请注意,即使使用标准MigrateDatabaseToLatestVersion初始化程序,问题也是可重现的.
我能够通过使用以下丑陋的反射黑客来解决它:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
最初的异常消失了,但现在我又得到另一个说'没有为提供者'System.Data.SQLite找到MigrationSqlGenerator'.使用目标迁移配置类中的SetSqlGenerator方法注册其他SQL生成器.我认为这是与MigrationSqlGeneratorSQLite EF服务缺乏相关的另一个问题.它可能会也可能不会成为问题,具体取决于您是如何在6.1.3中解决的.
无论如何,我不建议使用上面的黑客.要么等待狐狸修复,要么现在降级到6.1.3.
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |