Ef миграция для maui (так как нравиться мне)

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

Я надеюсь вы прочитали "превью", поэтому, без лишних слов, приступаем сразу к делу!

Создаем два проекта, в одном будет наш Maui, а в другом контекст.

Вот такая вот структура( надеюсь к названиям не прикапаются )
Вот такая вот структура( надеюсь к названиям не прикапаются )

Создадим простенькие модели в MauiMigrationsExample.Dal

namespace MauiMigrationsExample.Dal.Models;

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;

    public List<Book> Books { get; set; } = null!;
}

public class Book
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;

    public int AuthorId { get; set; }
    public Author Author { get; set; } = null!;
}

А теперь самое важное! Я не хочу что бы настройка контекста происходила в Dal. Поэтому пойдем на "просто" решение: пропишем следующее условие в MauiMigrationsExample.Dal.csproj

<PropertyGroup Condition="'$(Configuration)'=='Migrate'">
  <DefineConstants>EF_MIGRATION</DefineConstants>
</PropertyGroup>

Ага, мы просто добавили константу для предпроцессора в случае если конфигурация равна Migrate. Дело в том что сам хочет dotnet-ef что бы контекст передавался в ServiceCollection. Это можно исправить с параметром --context(или -c) , но тогда обязательно нужно реализовать OnConfiguring. Однако как я сказал выше " Я не хочу что бы настройка контекста происходила в Dal".

Поэтому, далее пишем уже сам контекст, используя директивы предпроцессора.

using MauiMigrationsExample.Dal.Models;
using Microsoft.EntityFrameworkCore;
using SQLitePCL;

namespace MauiMigrationsExample.Dal;
public class MauiDbContex : DbContext
{
    public DbSet<Author> Authors { get; set; } = null!;
    public DbSet<Book> Books { get; set; } = null!;

#if !EF_MIGRATION
    public MauiDbContex(DbContextOptions options) : base(options)
    {
        Batteries_V2.Init();
    }

#else
    public MauiDbContex()
    {
        Batteries_V2.Init();
    }

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      ...
    }
}

И пишем следующую команду в корневой папке MauiMigrationsExample.Dal c параметром --configuration

 dotnet ef migrations add InitialCreate -c MauiDbContex --configuration Migrate

Если все сработало, то отлично! В следующий раз нам не нужно явно указывать контекст, но придется все так же писать --configuration Migrate

Ну теперь перейдем к настройке MauiMigrationsExample. Добавляем контекст :

builder.Services.AddDbContext<MauiDbContex>(options =>
        {
            var dbPath = Path.Combine(FileSystem.AppDataDirectory, "maui.sqlite");
            options.UseSqlite($"Filename={dbPath}");
        });

И настраиваем ваш App

using MauiMigrationsExample.Dal;
using Microsoft.EntityFrameworkCore;

namespace MauiMigrationsExample;

public partial class App : Application
{
	public App(MauiDbContex context)
	{
        MigrateIfHasMigration(context);

		InitializeComponent();

		MainPage = new AppShell();
	}

    private static void MigrateIfHasMigration(MauiDbContex contex)
    {
        if (contex.Database.GetPendingMigrations().Any())
        {
            contex.Database.Migrate();
        }
    }
}

Круть, все должно работать теперь. Спасибо за ваше внимание.

Источник: https://habr.com/ru/post/724380/


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

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

Если вы, как и я, уже являетесь большим поклонником Microsoft Entity Framework и хотели бы начать использовать его локально в своем мобильном приложении, с появлением .Net Maui на рынке, это стало воз...
7 марта 2022 года американская компания Fortinet, производитель оборудования под торговой маркой FortiGate, заявила о приостановке своей деятельности на территории России. Оборудование FortiGate после...
Привет! Я Олег, системный администратор в команде Timeweb, и в этой статье я расскажу, как мы перешли на актуальную версию Zabbix с минимальным простоем без потери функциональности. Здесь будет опи...
После начала пандемии и режима самоизоляции у бизнеса возникла проблема в виде необходимости обеспечить информационную безопасность сотрудников на удаленке. В самом деле, периметр бе...
Если честно, к Д7 у меня несколько неоднозначное отношение. В некоторых местах я попискиваю от восторга, а в некоторых хочется топать ногами и ругаться неприличными словами.