如何将连接字符串中的“Provider Name”添加到Context文件中?

问题描述 投票:0回答:3

我正在使用 Entity Framework 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";
    }
}

}

这里我在构造函数中添加了连接字符串。但是有什么办法可以将“Provider Name”添加到连接字符串中吗?

c# asp.net-mvc-4 entity-framework-5 entity-framework-migrations
3个回答
11
投票

您希望在数据库上下文中硬编码连接字符串是否有特殊原因。通常它应该存储在配置文件中。您可以在配置文件中指定提供程序并从您的上下文引用连接字符串。这将解决你的问题。

 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>

10
投票

是: 您可以准备一个可以传递给 DbContext 的 DbConnection 类型 它是由底层提供商构建的,并且已正确构建连接字符串。

所以要在 CODE 中实现这个连接字符串...见下文

<connectionStrings>
    <add name="MyCTX" connectionString="Data Source=localhost;Initial Catalog=MYDB ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>

回想一下,DBContext 有一个重载的构造函数

 public DbContext(DbConnection existingConnection, bool contextOwnsConnection)

所以你只需要底层工厂提供者构建的Dbconnection。 见

 public interface IDbConnectionFactory

由这3种类型实现:

系统.数据.实体.基础设施.SqlCeConnectionFactory System.Data.Entity.Infrastruct.LocalDbConnectionFactory 系统.数据.实体.基础设施.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;
    }

0
投票

您需要将流动注释添加到您的 dbcontext 类中:

[DbConfigurationType(typeof(MySqlEFConfiguration))]

改变这个:

public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser>

对此:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
    public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser>

您不必使用此解决方案添加提供商。

© www.soinside.com 2019 - 2024. All rights reserved.