C# 如何加上「;供应商名称“;是否在上下文文件的连接字符串中?

C# 如何加上「;供应商名称“;是否在上下文文件的连接字符串中?,c#,asp.net-mvc-4,entity-framework-5,entity-framework-migrations,C#,Asp.net Mvc 4,Entity Framework 5,Entity Framework Migrations,我使用实体框架5代码优先方法。这是我的上下文文件: using IMS.Domain.Inventory; using IMS.Domain.Security; using IMS.Domain.StoredProcedures; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.O

我使用实体框架5代码优先方法。这是我的上下文文件:

using IMS.Domain.Inventory;
using IMS.Domain.Security;
using IMS.Domain.StoredProcedures;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IMS.Domain.DBContext
{
    public class IMSDBContext : DbContext
    {
        public DbSet<ModuleAccounting> ModuleAccountings { get; set; }
        public DbSet<ModuleInfo> ModuleInfos { get; set; }
        public DbSet<ModuleType> ModuleTypes { get; set; }
        public DbSet<UserAccounting> UserAccountings { get; set; }
        public DbSet<UserGroup> UserGroups { get; set; }
        public DbSet<UserInfo> UserInfos { get; set; }


    //
    // set a connection string

    public IMSDBContext()  // Constructor of the Context
    {
        this.Database.Connection.ConnectionString =
            "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=IMSDB;Data Source=.\\SQLExpress";
    }
}
使用IMS.Domain.Inventory;
使用IMS.Domain.Security;
使用IMS.Domain.stored过程;
使用制度;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用System.Data.Object;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间IMS.Domain.DBContext
{
公共类IMSDBContext:DbContext
{
公共DbSet ModuleAccountings{get;set;}
公共数据库集模块信息{get;set;}
公共DbSet moduleType{get;set;}
公共数据库集用户帐户{get;set;}
公共数据库集用户组{get;set;}
公共DbSet UserInfos{get;set;}
//
//设置连接字符串
public IMSDBContext()//上下文的构造函数
{
this.Database.Connection.ConnectionString=
“集成安全性=SSPI;持久安全性信息=False;初始目录=IMSDB;数据源=。\\SQLExpress”;
}
}
}


这里我在构造函数中添加了连接字符串。但是,有没有办法将“提供者名称”添加到连接字符串中?

您希望在db上下文中硬编码连接字符串的原因是什么。通常它应该存储在配置文件中。您可以在配置文件中指定提供程序,并从上下文中引用连接字符串。那会解决你的问题

 public MyDbContext()
        : base("Name=MyDbContext")
    {
    }
在您的配置文件中

<connectionStrings>
    <add name="MyDbContext" connectionString="data source=.\sqlexpress;initial catalog=YourDbName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient"/>
  </connectionStrings>

是:您可以准备一个可以传递给DbContext的DbConnection类型 它是由基础提供程序生成的,并且已正确生成连接字符串

所以要在代码中实现这个连接字符串。。。见下文

<connectionStrings>
    <add name="MyCTX" connectionString="Data Source=localhost;Initial Catalog=MYDB ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
因此,您只需要底层工厂提供程序构建的Dbconnection。 看

由以下三种类型实现:

System.Data.Entity.Infrastructure.SqlCeConnectionFactory System.Data.Entity.Infrastructure.LocalDbConnectionFactory System.Data.Entity.Infrastructure.SqlConnectionFactory

下面是一个使用SQLConnectionFactory的示例。返回一个DBConnection。 可以传递给DBContext。 您可以在编程空闲时重复/更改或设置变量。对于其他2个提供商

 public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;
        // NOW MY PROVIDER FACTORY OF CHOICE, switch providers here 
        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }

您的连接字符串看起来像
SQLClient连接字符串
,因此提供程序是
SQLClient
,我们仅在
OleDB
连接字符串中添加
提供程序名
。如果您使用Azure配置设置替换本地主机设置,则配置中没有它的一个很好的理由。它们不允许提供程序属性。
 public interface IDbConnectionFactory
 public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;
        // NOW MY PROVIDER FACTORY OF CHOICE, switch providers here 
        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }