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
相关产品推荐
相关产品推荐

