2017-11-16 34 views
9

Pracuję z SQLite. Jestem w stanie używać Entity Framework 6.1.3 w mojej aplikacji WPF bez problemów, ale gdy go zaktualizować do 6.2.0 pojawia się następujący błąd:Aktualizacja do EF 6.2.0 z EF 6.1.3 powoduje, że przyczyny nie mogą uzyskać dostępu do błędu związanego obiektu

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"... 

jakieś pomysły?

+0

Pokaż nam kod źródłowy dla 'CRUD_On_Pipe' i' GetAll'. – mjwills

+0

@mjwills Tak, zaktualizowałem zarówno aplikację, jak i projekty testowe. – ferit

+0

@mjwills Zaktualizował pytanie tymi kodami źródłowymi. – ferit

Odpowiedz

5

Problem jest spowodowany zmianą RepositoryBase klasy i nieprawidłowego (IMO) realizacji IDbConnection.State nieruchomości przez SQLiteConnection klasy (rzucanie ObjectDisposedException zamiast wrócić ConnectionState.Closed gdy wezwał zbywanego obiektu).

To jest to samo, co w przypadku zgłoszenia w #398: NullReferenceException on Code First Migrations when Glimpse is installed. Zgodnie ze statusem, jest on już naprawiony w repozytorium EF6, ale niestety postanowił nie dostarczać łaty, więc musisz poczekać na v6.3. Zgłosiłem już problem SQLite z linkami do tego posta, więc mam nadzieję, że mogą zmienić zdanie.

Inną opcją jest zgłosić problem do rozwoju SQLite i zaczekać na poprawkę. W obu przypadkach trzeba poczekać na poprawkę po stronie SQLite lub EF6. Należy zwrócić uwagę, że problem jest odtwarzalny nawet przy użyciu inicjalizatora standardowego MigrateDatabaseToLatestVersion.

udało mi się obejść je za pomocą poniższego brzydkie odbicie 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); 
    } 
} 

Oryginalny wyjątek nie ma, ale teraz jestem coraz inny mówiący „Nie MigrationSqlGenerator znalezionych dla operatora” System. Data.SQLite ". Użyj metody SetSqlGenerator w klasie konfiguracji migracji docelowej, aby zarejestrować dodatkowe generatory SQL. " co moim zdaniem jest inną kwestią związaną z brakiem MigrationSqlGenerator w usługach SQLite EF. To może, ale nie musi być problem w zależności od tego, jak rozwiązałeś to w 6.1.3.

W każdym razie nie polecam używania powyższego hacka. Albo czekaj na naprawę lisa, albo na razie przejdź na wersję 6.1.3.