使用EF Core在运行时确定正在使用哪个db提供程序

时间:2016-11-15 23:01:30

标签: c# asp.net entity-framework asp.net-core entity-framework-core

在我们的ASP.NET Core和EF Core系统中,我们为系统的不同部分使用不同的数据库。我需要能够在运行时告诉使用哪个数据库提供程序,因为有些东西需要考虑到这一点。

在启动期间,SQL Server有这个:

  services.AddDbContext<MyContext>(
    options => options.UseSqlServer(config.GetConnectionString("DefaultConnection"))
  );

或者这适用于SQLite:

  services.AddDbContext<MyContext>(
    options => options.UseSqlite(config.GetConnectionString("DefaultConnection"))
  );

关键在于使用哪个数据库的知识,包含在系统内的某个地方。

在系统的某个任意点,我如何确定我正在使用哪个数据库?我可以访问MyContext。那里有什么可以揭示这些信息吗?

5 个答案:

答案 0 :(得分:5)

系统中您可以访问MyContext的任何地方,请执行以下操作:

context.Database.GetDbConnection().GetType().Name

例如,SQLite为SqliteConnection,SQL Server为SqlServerConnection等。

但是我不确定您之后是否需要处理连接!

答案 1 :(得分:4)

我在我的项目中使用2个数据库提供程序。

  • Npgsql.EntityFrameworkCore.PostgreSQL
  • Microsoft.EntityFrameworkCore.SqlServer

可以从Nuget软件包管理器中添加引用,包括在您的客户端项目中。

参考文献包含以下扩展方法。

Boolean isPostgreSQL = context.Database.IsNpgsql();
Boolean isSqlServer = context.Database.IsSqlServer();

答案 2 :(得分:2)

我不确定是否有公开的方式,但你可以查看context.Database.DatabaseCreator(你必须使用反射来访问DatabaseCreator),但通过查看类型,你可以告诉它是什么样的联系。例如,使用SQL,您将获得SqlServerDatabaseCreator。

编辑:是的,看看代码,我认为除了上面提到的内容之外,我还没有其他方法可以说明。 UseSqlServer方法不会在任何地方设置任何标志或类似的任何标志。这只是一家工厂。

答案 3 :(得分:1)

您可以开始的一点是DbContextOptions<T>,这是AddDbContext<T>方法的作用,您可以看到here

然后将其注入DbContext。

您也可以尝试在服务中请求DbContextOptionsDbContextOptions<MyContext>,然后对Extensions词典进行交互/检查。

SqliteOptionsExtension是Sqlite,您可以看到它已注册herehere

答案 4 :(得分:1)

对于EF Core 2:

dbContext.Database.ProviderName