Сбой надстройки sqlite uwp при обновлении до нового проекта - PullRequest
0 голосов
/ 15 мая 2018

хорошо, поэтому у меня есть sqlite база данных в моем uwp проекте (с структурой сущностей) согласно этой документации https://docs.microsoft.com/en-us/ef/core/get-started/uwp/getting-started

, поэтому у меня был целевой проект uwp Ежегодное обновление , поэтому в то время эта документация была устаревшей, и мне пришлось добавить код базы данных и прочее в мой проект uwp (а не в стандартный проект .Net), чтобы проект был установлен большим количеством пользователей.по всему магазину, и теперь у всех, очевидно, есть база данных, созданная на их устройствах, скажем Db1.db

Через год я обновил свое приложение и переназначил его на обновление создателей, и я сделал это вновый проект, потому что мне пришлось внести некоторые серьезные изменения в мое приложение, поэтому я хотел начать с чистого проекта, я добавил свои функции, а также добавил базу данных так же, как и предыдущий проект с тем же именем базы данных Db1.db и затем я опубликовал его для хранения.

Проблема

Теперь, когда я опубликовал свой второй пакет, он упал на DBМетод Context.Migrate () , который должен быть в конструкторе app.xaml.cs Я понимаю, что он потерпел крах, поскольку имя базы данных было одинаковым, и в обоих проектах была только 1 миграция, известная как MyFirstMigration и каким-то образом конфликтовал и вылетал приложение.Я могу подтвердить это, потому что вскоре после того, как я обновил свой 2-й пакет (который предназначен для обновлений создателей) и изменил имя базы данных tO Db2.db , и теперь я не получил сбой, потому что теперь приложение игнорируетстарая база данных на устройстве пользователя и просто создание и использование новой базы данных, что не является лучшим способом, потому что мой существующий пользователь не может получить доступ к данным, которые они имели в Db1 , хотя новые пользователи не будут затронуты, поскольку у них есть все ихданные только в Db2 .

Теперь вот ситуация прямо сейчас.

Группа пользователей 1 у этих пользователей есть своистарые данные в db1 и новые данные в db2

группа пользователей 2 все эти пользователи хранят свои данные в db2

Я, вероятно, буду продолжать создавать новые проекты с нуля, чтобы ориентироваться на новые SDK, потому что мне нравится делать новые крупные обновления с нуля, что помогает мне легко реорганизовать целое приложение.Итак, как я могу использовать одно и то же имя базы данных в моих новых проектах без сбоя приложения?Я не изменяю свою модель, моя модель останется прежней, и я хочу продолжать использовать только 1 файл базы данных, независимо от того, сколько новых проектов я публикую в магазине, приложение всегда должно общаться с этим 1 файлом базы данных.было бы это возможно, если бы я просто скопировал папку Migrations из моего старого проекта, вставил в нее новый проект и оставил эту папку миграции согласованной в новых версиях?или есть какой-то другой способ?

Также обратите внимание, что теперь в моих новых проектах моей минимальной целью будет обновление создателей падений, поэтому я буду использовать стандартную библиотеку .net, чтобы хранить там свои дБ.как уже упоминалось в документах, которые я упоминал выше, поэтому я хотел бы продолжать использовать db2.db и в моих новых проектах.Спасибо за чтение.

1 Ответ

0 голосов
/ 16 мая 2018

Похоже, проблема синхронизации пользовательских данных. Как я понимаю, вы можете использовать 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 и копирования данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...