Когда пользователям отказано в доступе к папке AppData (роуминг), SQL Server Compact 4.0 не может работать в Windows 7, но все еще может работать в Windows 10 - PullRequest
0 голосов
/ 15 октября 2018

У меня есть настольное приложение на основе WPF, использующее SQL Server Compact 4.0 с Entity Framework и LINQ.Он работал нормально в течение нескольких лет, пока недавно у некоторых пользователей возникли проблемы с его открытием, поскольку он продолжает получать это исключение.

Exception at outer most = System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlServerCe.SqlCeException: Unspecified error [ sqlcese40.dll ]
at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
at System.Data.SqlServerCe.SqlCeConnection.Open()
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()
at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.DbContextTransaction.EnsureOpenConnection()
at System.Data.Entity.DbContextTransaction..ctor(EntityConnection connection)
at System.Data.Entity.Database.BeginTransaction()
at Ecms.Utilities.DatabaseVersionHelper.UpdateToVersion(String database, Int32 version)
EXCEPTION: System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlServerCe.SqlCeException: Unspecified error [ sqlcese40.dll ]
at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
at System.Data.SqlServerCe.SqlCeConnection.Open()
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()
at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.DbContextTransaction.EnsureOpenConnection()
at System.Data.Entity.DbContextTransaction..ctor(EntityConnection connection)
at System.Data.Entity.Database.BeginTransaction()
at Ecms.Utilities.DatabaseVersionHelper.UpdateToVersion(String database, Int32 version)

Кажется, это происходит всякий раз, когда создается новый экземпляр сущности, подобный следующему кодуblock.

using (var db = new MyEntity())
{
    // Do something
}

Он был создан с опцией «EF Designer from database», когда я добавляю новую «ADO.NET Entity Data Model».Я действительно пытался использовать SQLite, но я так и не смог установить его и заставить его работать в Visual Studio Community 2015. Я также посмотрел на LocalDB, но кажется, что пользователи должны установить что-то дополнительное вместе с моим приложением, чтобы работать именно так, как я ».Я пытаюсь избежать.

Я обнаружил, что проблема возникает, когда пользователи не имеют прав доступа к папке AppData (Roaming).Я тестировал на виртуальной машине с Windows 7. Приложение будет работать, если у меня есть разрешения на доступ к папке AppData (Roaming) и наоборот.

Однако при тестировании на виртуальной машине с Windows 10 приложениеработает нормально, независимо от того, есть ли у меня разрешения на доступ к папке AppData (Roaming).

Обратите внимание, что мое приложение не использует папку AppData (Roaming) преднамеренно.Я подозреваю, что, однако, некоторые библиотеки зависимостей используют его, и до сих пор я мог только определить, что затронут SQL Server Compact 4.0.

Также имейте в виду, что затронутые пользователи кажутся непреклонными в том, что они не меняют права доступа кпапка AppData (Roaming).

Интересно, я также обнаружил, что некоторые приложения не открываются, когда папка AppData (Roaming) ограничена, например Notepad ++ и Skype.

У кого-нибудь есть подобный опыт?Почему это происходит в Windows 7, а не в Windows 10?Играет ли папка AppData (Roaming) решающую роль для работы многих настольных приложений?Есть ли обходной путь?

1 Ответ

0 голосов
/ 15 октября 2018

Создайте установщик приложения, который создает папку в AppData, и поместите туда базу данных

...