Я надеюсь, вы прочитали "превью", поэтому, приступаем сразу к делу!
Создаем два проекта, в одном будет наш 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();
}
}
}
Круть, все должно работать теперь. Спасибо за ваше внимание.