15

私はEntity Framework 5 Code-first approchを使用しています。ここに私のコンテキストファイルがあります:

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";
    }
}

}

ここでは、コンストラクターに接続文字列を追加しました。しかし、「プロバイダー名」を接続文字列に追加する方法はありますか?

4

2 に答える 2

11

接続文字列を 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>
于 2013-08-25T13:50:33.360 に答える
10

はい: 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>

DBContext にはオーバーロードされたコンストラクターがあることを思い出してください。

 public DbContext(DbConnection existingConnection, bool contextOwnsConnection)

したがって、基礎となるファクトリ プロバイダーによって構築された Dbconnection だけが必要です。見る

 public interface IDbConnectionFactory

これは、次の 3 つのタイプによって実装されます。

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;
    }
于 2013-08-25T14:25:19.043 に答える