- 将迁移文件按数据库类型分目录存放 (Migrations/SQLite, MySQL, PostgreSQL, SqlServer) - 新增各数据库提供程序的 DesignTimeDbContextFactory,支持 --provider 参数切换 - 新增 ProviderAppDataContexts,定义各数据库对应的 AppDataContext 子类 - DatabaseExtensions 增加 AddProviderAppDataContext 方法,按配置自动注册对应 DbContext - 修正 MySQL 提供程序调用方式 (UseMySql -> UseMySQL) - UserEntity 模型增加新字段 - 更新 add-migration.ps1
105 lines
4.0 KiB
C#
105 lines
4.0 KiB
C#
using Microsoft.EntityFrameworkCore.Design;
|
|
|
|
namespace Avalonia_EFCore.Database
|
|
{
|
|
/// <summary>
|
|
/// 设计时 DbContext 工厂,用于 EF Core 迁移工具生成迁移代码。
|
|
/// </summary>
|
|
public class AppDataContextFactory : IDesignTimeDbContextFactory<AppDataContext>
|
|
{
|
|
/// <summary>
|
|
/// 创建用于设计时的 AppDataContext 实例,默认使用 SQLite 提供程序。
|
|
/// </summary>
|
|
/// <param name="args">命令行参数。</param>
|
|
/// <returns>配置好的数据上下文实例。</returns>
|
|
public AppDataContext CreateDbContext(string[] args)
|
|
{
|
|
return new AppDataContext(DesignTimeDatabaseConfiguration.Create(args));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// SQLite 迁移设计时工厂。
|
|
/// </summary>
|
|
public sealed class SqliteAppDataContextFactory : IDesignTimeDbContextFactory<SqliteAppDataContext>
|
|
{
|
|
/// <inheritdoc />
|
|
public SqliteAppDataContext CreateDbContext(string[] args)
|
|
=> new(DesignTimeDatabaseConfiguration.Create(args, DatabaseProvider.SQLite));
|
|
}
|
|
|
|
/// <summary>
|
|
/// SQL Server 迁移设计时工厂。
|
|
/// </summary>
|
|
public sealed class SqlServerAppDataContextFactory : IDesignTimeDbContextFactory<SqlServerAppDataContext>
|
|
{
|
|
/// <inheritdoc />
|
|
public SqlServerAppDataContext CreateDbContext(string[] args)
|
|
=> new(DesignTimeDatabaseConfiguration.Create(args, DatabaseProvider.SqlServer));
|
|
}
|
|
|
|
/// <summary>
|
|
/// PostgreSQL 迁移设计时工厂。
|
|
/// </summary>
|
|
public sealed class PostgreSqlAppDataContextFactory : IDesignTimeDbContextFactory<PostgreSqlAppDataContext>
|
|
{
|
|
/// <inheritdoc />
|
|
public PostgreSqlAppDataContext CreateDbContext(string[] args)
|
|
=> new(DesignTimeDatabaseConfiguration.Create(args, DatabaseProvider.PostgreSQL));
|
|
}
|
|
|
|
/// <summary>
|
|
/// MySQL 迁移设计时工厂。
|
|
/// </summary>
|
|
public sealed class MySqlAppDataContextFactory : IDesignTimeDbContextFactory<MySqlAppDataContext>
|
|
{
|
|
/// <inheritdoc />
|
|
public MySqlAppDataContext CreateDbContext(string[] args)
|
|
=> new(DesignTimeDatabaseConfiguration.Create(args, DatabaseProvider.MySQL));
|
|
}
|
|
|
|
internal static class DesignTimeDatabaseConfiguration
|
|
{
|
|
public static DatabaseConfiguration Create(string[] args, DatabaseProvider defaultProvider = DatabaseProvider.SQLite)
|
|
{
|
|
DatabaseProviderRegistry.RegisterDefaults();
|
|
|
|
var provider = GetProvider(args) ?? defaultProvider;
|
|
return provider switch
|
|
{
|
|
DatabaseProvider.SQLite => DatabaseConfiguration.ForSQLite("avalonia-api.db"),
|
|
DatabaseProvider.SqlServer => DatabaseConfiguration.ForSqlServer("(localdb)\\MSSQLLocalDB", "AvaloniaApi"),
|
|
DatabaseProvider.PostgreSQL => DatabaseConfiguration.ForPostgreSQL("localhost", "avalonia_api", "postgres", "postgres"),
|
|
DatabaseProvider.MySQL => DatabaseConfiguration.ForMySQL("localhost", "avalonia_api", "root", "root"),
|
|
_ => DatabaseConfiguration.ForSQLite("avalonia-api.db"),
|
|
};
|
|
}
|
|
|
|
private static DatabaseProvider? GetProvider(string[] args)
|
|
{
|
|
for (var i = 0; i < args.Length; i++)
|
|
{
|
|
var arg = args[i];
|
|
string? value = null;
|
|
|
|
if (arg.Equals("--provider", StringComparison.OrdinalIgnoreCase) && i + 1 < args.Length)
|
|
{
|
|
value = args[i + 1];
|
|
}
|
|
else if (arg.StartsWith("--provider=", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
value = arg["--provider=".Length..];
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(value)
|
|
&& Enum.TryParse<DatabaseProvider>(value, ignoreCase: true, out var provider))
|
|
{
|
|
return provider;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|