У меня есть настольное приложение на основе 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) решающую роль для работы многих настольных приложений?Есть ли обходной путь?