2017-11-16 14 views
9

SQLite로 작업하고 있습니다. 나는 문제없이 내 WPF 응용 프로그램에서 엔티티 프레임 워크 6.1.3을 사용할 수 있어요,하지만 난 다음 오류 얻을 6.2.0로 업데이트 할 때 :EF 6.1.3에서 EF 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"... 

어떤 아이디어?

+0

'CRUD_On_Pipe'와'GetAll'에 대한 소스 코드를 보여주십시오. – mjwills

+0

@mjwills 예 앱과 테스트 프로젝트를 모두 업데이트했습니다. – ferit

+0

@mjwills 질문을 해당 소스 코드로 업데이트했습니다. – ferit

답변

5

문제는 SQLiteConnection 클래스 (대신에 배치 된 오브젝트를 호출하면 ConnectionState.Closed 돌리는 ObjectDisposedException 던지고)로 RepositoryBase 클래스 IDbConnection.State 속성 잘못된 (IMO) 구현에서의 변화에 ​​의해 야기된다.

#398: NullReferenceException on Code First Migrations when Glimpse is installed에보고 된 내용과 같습니다. 상태에 따르면, 이미 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); 
    } 
} 

원래 예외는 사라,하지만 지금은 시스템 '아니 MigrationSqlGenerator가 공급자에 대한 발견'말하는 또 다른 하나를 얻고있다. Data.SQLite '. 추가 SQL 생성기를 등록하려면 대상 마이그레이션 구성 클래스의 SetSqlGenerator 메서드를 사용하십시오. ' 나는 SQLite EF 서비스에서 MigrationSqlGenerator의 부족과 관련된 다른 문제라고 생각합니다. 6.1.3에서 어떻게 해결했는지에 따라 문제가 될 수도 있고 아닐 수도 있습니다.

어쨌든 위의 해킹을 사용하지 않는 것이 좋습니다. 여우 픽스를 기다리든지 6.1.3으로 다운 그레이드하십시오.