C# 在实体框架(Oracle或SQL Server)中检测dbms类型

C# 在实体框架(Oracle或SQL Server)中检测dbms类型,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,实体框架如何检测它是通过代码从SQL Server还是Oracle创建的?有吗 返回源数据库类型的属性或方法?我想不出比获取并检查其类型更好的方法 如果创建类库解决方案并安装NUnit和EntityFramework nuget软件包,则可以运行以下程序 using System.Data.Common; using System.Data.Entity; using System.Diagnostics; using NUnit.Framework; namespace efProvider

实体框架如何检测它是通过代码从SQL Server还是Oracle创建的?有吗
返回源数据库类型的属性或方法?

我想不出比获取并检查其类型更好的方法

如果创建类库解决方案并安装NUnit和EntityFramework nuget软件包,则可以运行以下程序

using System.Data.Common;
using System.Data.Entity;
using System.Diagnostics;
using NUnit.Framework;

namespace efProviderChooser
{
    public class MyThing
    {
        public int Id { get; set; }
    }

    public class MyContext : DbContext
    {
        public DbSet<MyThing> Things { get; set; }
    }

    public class Test
    {
        [Test]
        public void CanGetProvider()
        {
            var context = new MyContext();          
            var dbProviderFactory = DbProviderFactories
                                     .GetFactory(
                                       context.Database.Connection);

            Debug.WriteLine(dbProviderFactory.GetType());
            //gives one of 
            //System.Data.EntityClient.EntityProviderFactory
            //System.Data.Odbc.OdbcFactory
            //System.Data.OleDb.OleDbFactory
            //System.Data.OracleClient.OracleClientFactory
            //System.Data.SqlClient.SqlClientFactory
            //this list could change!

            // here I get SqlClient
            Assert.That(dbProviderFactory.GetType().ToString().Contains("SqlClient"));
        }
    }
}
使用System.Data.Common;
使用System.Data.Entity;
使用系统诊断;
使用NUnit.Framework;
命名空间efProviderChooser
{
公共阶级神话
{
公共int Id{get;set;}
}
公共类MyContext:DbContext
{
公共DbSet Things{get;set;}
}
公开课考试
{
[测试]
public-void-CanGetProvider()
{
var context=new MyContext();
var dbProviderFactory=dbProviderFactorys
格特工厂(
context.Database.Connection);
Debug.WriteLine(dbProviderFactory.GetType());
//给出一个
//System.Data.EntityClient.EntityProviderFactory
//System.Data.Odbc.OdbcFactory
//System.Data.OleDb.OleDb工厂
//System.Data.OracleClient.OracleClientFactory
//System.Data.SqlClient.SqlClientFactory
//这个列表可能会改变!
//这里是SqlClient
Assert.That(dbProviderFactory.GetType().ToString()包含(“SqlClient”);
}
}
}

实体框架通过在
DbContext
中使用的连接来识别它(或者通过连接字符串,因为它有
提供者
部分,或者直接从实例本身)。您可以从
DbContext.Database.Connection
获取“类型”。即:

DbContext.Database.Connection.GetType().Name

连接字符串指定数据库提供程序。你想达到什么目标?您是否有可能连接到两个不同数据库的单个上下文?!我想执行一个自定义查询,它的语法取决于DBMS。所以我需要知道我必须选择哪种语法,但为什么都在一个上下文中?当然,您应该有一个SQLContext和一个OracleContext,然后在适当的时候调用它们。应用程序中的什么决定了你要调用哪个数据库?是的,这是一种比我更快获取信息的方法。。。啊!