You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core共享上下文适配MySQL与SQLite的迁移问题求助

解决方案

一、解决跨数据库(SQLite/MySQL)的迁移生成问题

问题本质

EF Core的迁移和ModelSnapshot与当前使用的数据库提供者强绑定,同一个StoreCustomersContext在生成SQLite和MySQL迁移时,会因注解、类型映射差异导致Snapshot冲突,无法分别生成对应数据库的迁移文件。

解决步骤

1. 为不同数据库创建独立的DbContext子类

在Infrastructure项目中,创建两个继承自StoreCustomersContext的子类,分别对应SQLite和MySQL:

// SQLite专用上下文
public class StoreCustomersSqliteContext : StoreCustomersContext
{
    public StoreCustomersSqliteContext(DbContextOptions<StoreCustomersSqliteContext> options) 
        : base(options) { }
}

// MySQL专用上下文
public class StoreCustomersMySqlContext : StoreCustomersContext
{
    public StoreCustomersMySqlContext(DbContextOptions<StoreCustomersMySqlContext> options) 
        : base(options) { }
}

2. 修改原StoreCustomersContext的构造函数

确保原上下文允许子类传递配置:

public class StoreCustomersContext : DbContext
{
    public StoreCustomersContext(DbContextOptions options) 
        : base(options) { }

    // 保留原有DbSet和OnModelCreating逻辑
}

3. 更新迁移工厂类并重新生成迁移

  • MAUI端迁移工厂:改为使用StoreCustomersSqliteContext
public class DbContextMigrationFactory : IDesignTimeDbContextFactory<StoreCustomersSqliteContext>
{
    public StoreCustomersSqliteContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<StoreCustomersSqliteContext>();
        // 迁移生成时无需真实路径,使用临时SQLite文件即可
        builder.UseSqlite("Data Source=temp_sqlite.db");
        return new StoreCustomersSqliteContext(builder.Options);
    }
}

执行迁移命令:

dotnet ef migrations add SqliteInitialCreate -s StoreSysAppDistribuidorasMigrations -p Infrastructure -v --context StoreCustomersSqliteContext --output-dir Migrations/SQLiteMigrations
  • MySQL端迁移工厂:改为使用StoreCustomersMySqlContext
public class StoreCustomersMySqlContextFactory : IDesignTimeDbContextFactory<StoreCustomersMySqlContext>
{
    public StoreCustomersMySqlContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        var builder = new DbContextOptionsBuilder<StoreCustomersMySqlContext>();
        
        string connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseMySql(
            connectionString,
             ServerVersion.AutoDetect(connectionString));

        return new StoreCustomersMySqlContext(builder.Options);
    }
}

执行迁移命令:

dotnet ef migrations add InitialCreate -s API_StoreSysBackendCustomers -p Infrastructure -v --context StoreCustomersMySqlContext --output-dir Migrations/MySqlMigrations

二、解决MAUI端Database.Migrate()无法找到/创建数据库的问题

核心原因

MAUI应用的文件系统路径与普通.NET项目不同,硬编码或非平台适配的路径会导致数据库无法被正确创建或访问,必须使用MAUI提供的应用数据目录存储SQLite数据库。

解决步骤

1. 配置正确的SQLite数据库路径

在MAUI项目的MauiProgram.cs中,使用FileSystem.AppDataDirectory构造合法路径:

builder.Services.AddDbContext<StoreCustomersSqliteContext>(options =>
{
    string dbPath = Path.Combine(FileSystem.AppDataDirectory, "store_customers.db");
    options.UseSqlite($"Data Source={dbPath}");
});

2. 在应用启动时执行迁移

在MAUI初始化流程中添加迁移逻辑,确保数据库被创建并应用最新迁移:

var app = builder.Build();

using var scope = app.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<StoreCustomersSqliteContext>();
dbContext.Database.Migrate();

return app;

3. 验证路径有效性

调试时输出数据库路径,确认文件是否生成:

string dbPath = Path.Combine(FileSystem.AppDataDirectory, "store_customers.db");
Debug.WriteLine($"SQLite数据库路径:{dbPath}");

可通过平台工具查看路径下的文件(如Android的Device File Explorer、iOS的Files应用)。

内容的提问来源于stack exchange,提问作者Alejo Moya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:43:20