如何在EF6 DbMigration中获取当前活动的数据库提供程序?
EF6 迁移中判断当前活动数据库提供程序的实现方式
EF6 原生支持在单迁移文件中按数据库提供程序编写分支逻辑,不需要额外开发扩展,DbMigration 基类已经内置了对应能力。
核心实现
直接在迁移类的Up()/Down()方法中访问受保护属性ActiveProvider即可,该属性会返回当前迁移运行时生效的数据库提供程序固定名称,取值完全匹配当前项目配置的数据库连接对应的提供程序,本地执行Update-Database、生产环境自动迁移场景下取值均准确。
注意EF6体系下的提供程序固定名称和EF Core的命名格式不同,对应MSSQL、PostgreSQL两个数据库的常用判断值为:
- MSSQL(传统SqlClient提供程序):
System.Data.SqlClient - MSSQL(新版Microsoft.Data.SqlClient提供程序):
Microsoft.Data.SqlClient - PostgreSQL(Npgsql EF6提供程序):
Npgsql
可直接使用的代码示例
public partial class TestMigration: DbMigration { protected override void Up() { // SQL Server 专属执行逻辑 if(ActiveProvider == "System.Data.SqlClient" || ActiveProvider == "Microsoft.Data.SqlClient") { // 编写MSSQL特有的SQL语句、配置MSSQL专属列类型等操作 Sql("/* 此处放MSSQL专属执行SQL */"); } // PostgreSQL 专属执行逻辑 if(ActiveProvider == "Npgsql") { // 编写PG特有的SQL语句、配置PG专属列类型等操作 Sql("/* 此处放PostgreSQL专属执行SQL */"); } } protected override void Down() { // 回滚逻辑可使用完全相同的判断方式 if(ActiveProvider == "System.Data.SqlClient" || ActiveProvider == "Microsoft.Data.SqlClient") { // MSSQL专属回滚逻辑 } if(ActiveProvider == "Npgsql") { // PostgreSQL专属回滚逻辑 } } }
补充说明
如果需要做更细粒度的适配,也可以直接通过基类暴露的Connection属性判断当前数据库连接的实际类型,适合需要调用提供程序专属API的场景,不需要硬编码提供程序名称字符串,不容易因为字符串拼写错误导致判断失效,示例逻辑:
if (Connection is System.Data.SqlClient.SqlConnection || Connection is Microsoft.Data.SqlClient.SqlConnection) { // MSSQL 专属逻辑 } if (Connection is Npgsql.NpgsqlConnection) { // PostgreSQL 专属逻辑 }
内容的提问来源于stack exchange,提问作者Agata Lenz
相关产品推荐
相关产品推荐

