Entity Framework c предустановленной БД в вашем приложении на .NET MAUI

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Данный текст является логичным продолжением статьи Entity Framework c Code-First миграциями для .NET MAUI. В ней рассказывалось как подключить и использовать, возможно, уже привычную вам по работе с апи технологию работы с БД Entity Framework теперь в вашем мобильном приложении.


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


Итак, допустим, в процессе разработки мы заполнили БД нужными вам значениями и теперь вы хотите чтобы они были доступны всем пользователям. Покажем на примере.


Кладем ваш файл базы данных в Resources/Raw/Db/app.db3 — Build Action: MauiAsset. Замечательно, файл уже с нами.


Теперь, чтобы его реально использовать при исполнении приложения, надо переложить файл из ресурсов в папку уже развернутого после установки приложения.


Регистрируем наш контекст таким образом (MauiProgram.cs):


private static object _lockDb = new(); //не нужны лишние проблемы

public static MauiApp CreateMauiApp(){

...
services.AddTransient<LocalDatabase>((services) =>
{
    lock (_lockDb)
    {
        var filenameDb = Path.Combine(FileSystem.AppDataDirectory, "app.db3");
        if (!File.Exists(filenameDb))
        {
            using var stream = FileSystem.OpenAppPackageFileAsync("ML/app.db3").GetAwaiter().GetResult();
            using (var memoryStream = new MemoryStream())
            {
                stream.CopyTo(memoryStream);
                File.WriteAllBytes(filenameDb, memoryStream.ToArray());
            }
        }
        return new LocalDatabase(filenameDb);
    }
});
...

}

Отлично, теперь наша пре-заполненная база всегда с нами на продакшене. Мы проверили, развернут ли файл бд в папке, и закрыли проблему. Одновременно используем лок, чтобы не получить одновременную попытку инициализации бд из разных потоков.


Напоследок, напомним, кто-такая была LocalDatabase:


public class LocalDatabase : DbContext
{
 #region CONSTRUCTOR

 //parameterless constructor must be above the others,
 //as it seems that EF Tools migrator just takes the .First() of them

 /// <summary>
 /// Constructor for creating migrations
 /// </summary>
 public LocalDatabase()
 {
     File = Path.Combine("../", "UsedByMigratorOnly1.db3");
     Initialize();
 }

 /// <summary>
 /// Constructor for mobile app
 /// </summary>
 /// <param name="filenameWithPath"></param>
 public LocalDatabase(string filenameWithPath)
 {
     File = filenameWithPath;
     Initialize();
 }
 void Initialize()
 {
     if (!Initialized)
     {
         Initialized = true;

         SQLitePCL.Batteries_V2.Init();

         //Database.EnsureDeleted(); //use in dev process when needed

         Database.Migrate();
     }
 }
 public static async Task<LocalDatabase> CreateAsync(string filenameWithPath)
 {
     var instance = new LocalDatabase(filenameWithPath);
     await instance.InitializeAsync();
     return instance;
 }
 private async Task InitializeAsync()
 {
     if (!Initialized)
     {
         Initialized = true;

         SQLitePCL.Batteries_V2.Init();

         await Database.MigrateAsync();
     }
 }

 public static string File { get; protected set; }
 public static bool Initialized { get; protected set; }

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder
         .UseSqlite($"Filename={File}");
 }

 #endregion

 public void Reload()
 {
     Database.CloseConnection();
     Database.OpenConnection();
 }
}

Не забудьте ознакомиться с предыдущей статьей: Entity Framework c Code-First миграциями для .NET MAUI


Надеюсь, этот материал был вам полезен, увидимся на берегах МАУИ!

Источник: https://habr.com/ru/articles/841272/


Интересные статьи

Интересные статьи

Хей-хей! Меня зовут Айя, и я старший продуктовый дизайнер в Ozon, занимаюсь опытом покупателя в команде оформления заказов и геосервисов. Замечали когда-нибудь, как приложения цепляют настолько, ...
Всем привет! Меня зовут Александр Кулик, я .NET-разработчик из команды checkout в Тинькофф. Занимаюсь бэкенд-разработкой по интеграции платежных решений, внешних сервисов и созданию собственных разраб...
Конец декабря, многие подводят свои итоги, а мы решили оглянуться и посмотреть, что хорошего (и не очень) случилось в мире .NET-разработки за этот год, и спросили об этом наших разработчиков.Из хороше...
Несколько месяцев назад мы публиковали статью об истории модульных устройств — ноутбуков, смартфонов, часов. Это была статья с налетом грусти, ведь ни одно перспективное устройство так ...
SAP сейчас активно развивает Cloud Foundry (CF) и внедрила ее в SAP Cloud Platform, в качестве основного элемента облачной инфраструктуры. CF выполняет роль PaaS и позвол...