Операция не разрешена в IsolatedStorageFileStream
using (EntityDataContext amdb = new EntityDataContext(StrConnectionString))
{
if (amdb.DatabaseExists())
{
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoStore.FileExists(databaseName))
{
copyDatabase = true;
}
else
{
using (IsolatedStorageFileStream databaseStream = isoStore.OpenFile(databaseName, FileMode.Open, FileAccess.Read)) // error here
{
using (Stream db = Application.GetResourceStream(new Uri(databaseName, UriKind.Relative)).Stream)
{
if (databaseStream.Length < db.Length)
copyDatabase = true;
}
}
}
}
}
else
{
//error with the database that has been packaged
}
if (copyDatabase)
new Worker().Copy(databaseName);
}
2 ответа
Убедитесь, что в параметрах режима доступа к изолированному хранилищу вы точно указали возможность записывать данные, а не просто читать.
Вы тестировали с устройством?
Из того, что я могу сказать, вы пытаетесь прочитать файл базы данных, пока у вас все еще открыто соединение с базой данных. Поскольку a DataContext блокирует базу данных (и, следовательно, файл), вы не можете читать ее одновременно.
Чтобы закрыть соединение с базой данных, попробуйте закрыть EntityDataContext
объект (по телефону amdb.Close()
или закрыв оператор использования
Попробуйте что-то вроде этого:
bool shouldCopyDatabase = false;
bool databaseExists = false;
using (EntityDataContext amdb = new EntityDataContext(StrConnectionString))
{
databaseExists = amdb.DatabaseExists();
}
if (databaseExists == true)
{
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoStore.FileExists(databaseName))
{
copyDatabase = true;
}
else
{
using (IsolatedStorageFileStream databaseStream = isoStore.OpenFile(databaseName, FileMode.Open, FileAccess.Read)) // error here
{
using (Stream db = Application.GetResourceStream(new Uri(databaseName, UriKind.Relative)).Stream)
{
if (databaseStream.Length < db.Length)
copyDatabase = true;
}
}
}
}
}
if (copyDatabase)
new Worker().Copy(databaseName);
Перемещая функцию доступа к изолированному хранилищу за пределы using (EntityDataContext amdb = new EntityDataContext(StrConnectionString))
область действия, вы разрешаете закрытие подключения к базе данных в первую очередь.