Похоже, проблема синхронизации пользовательских данных. Как я понимаю, вы можете использовать db2.db в своем новом обновлении UWP для создателей осени (мы назовем его Новой версией), но после того, как пользователь обновит ваше приложение до Новой версии и запустит его в В первый раз вы можете проверить, существует ли в вашем проекте db1.db , если он существует, вы можете скопировать данные из db1.db в новый db2 .db .
Этот способ выглядит как резервное копирование и восстановление, но в приложении uwp обновление не удалит ваш db1.db , вам просто нужно «восстановить» или скопировать данные в ваш новый db2 .db , который создается с помощью новой функции использования приложения EF Core UWP, тогда вы можете просто использовать db2.db для последующего хранения пользовательских данных, и вам больше не нужно использовать db1.db снова.
--- Update ---
Вы говорите каждый раз, когда я создаю новый проект, мне нужно копировать данные из предыдущей базы данных? значит я не могу использовать один и тот же файл базы данных?
На самом деле, вам просто нужно скопировать один раз из db1.db в db2.db, потому что вы преобразовали свой проект в EF Core. В более поздней версии, поскольку вы использовали EF Core, если вы создаете новое обновление проекта, вы можете использовать db2.db напрямую, без проблем в моем тесте.
как я могу проверить, существует ли старая БД?
Поскольку вы знаете имя файла БД и местоположение файла, вы можете проверить, существует ли старый БД, проверив, существует ли файл БД.
private async Task<bool> IsFileExisted(string fileName)
{
var result= await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName);
if (result == null)
{
return false;
}
return true;
}
Поскольку предоставленный вами документ , кажется, что метод Migrate
является вызовом в конструкторе приложения, это приведет к жесткому использованию асинхронного метода. Таким образом, вы можете поместить код Migrate
в обработчик событий OnLaunched
приложения.
protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
using (var db = new BloggingContext())
{
//db.Database.EnsureCreated();
bool isExist = await IsFileExisted("db1.db");
if (!isExist)
{
db.Database.Migrate();
}
}
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
...
}
Если вы используете этот сценарий, вам не нужно будет создавать db2.db, вы можете просто использовать db1.db в своем проекте New Version.
прямо сейчас мой последний проект использует db2, так что я могу подключиться к db1 из этого проекта без вызова функции переноса? (потому что функция переноса вызывает сбой приложения.), а затем просто копирует данные из db1 в db2.
Функция переноса применяет любые ожидающие миграции для контекста к базе данных и создает базу данных, если она еще не существует. Вам нужно использовать функцию migrate для создания базы данных, если она не существует. Конечно, если db1.db существует, вы можете подключиться к db1 для получения данных без вызова функции переноса.
Чтобы реализовать его, вы можете следовать документу , чтобы создать класс NewBloggingContext
для наследования DbContext
в библиотеке моделей для подключения к db1.db и копирования данных.