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";
}
}
}
ここでは、コンストラクタに接続文字列を追加しました。しかし、「プロバイダ名」を接続文字列に追加する方法はありますか?
接続文字列を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タイプを準備できます。
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つのタイプによって実装されます。
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;
}