8

私はエンティティフレームワーク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"; 
    } 
} 

}

:ここに私のコンテキストファイルです。しかし、接続文字列に「プロバイダ名」を追加する方法はありますか?

+0

あなたの接続文字列は 'SQLClient connection string'のように見えるので、プロバイダは' SQLClient'ですので、 'OleDB'接続文字列にのみ' Provider name'を追加します。 –

答えて

6

DBコンテキストで接続文字列をハードコードする必要がある理由は何ですか?通常は、configファイルに格納する必要があります。設定ファイルでプロバイダを指定し、コンテキストから接続文字列を参照することができます。それがあなたの問題を解決します。

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> 
+0

ありがとうございました。それはうまく動作します。 – raisul

+1

Azureの設定を使用してローカルホストの設定を置き換えているのであれば、あなたの設定でそれを持たないのが良い理由です。プロバイダ属性を許可しません。 – Richard

6

はい:あなたは、基になるプロバイダーによって構築し、適切に構築された接続文字列を持っている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を必要としますプロバイダ。

System.Data.Entity.Infrastructure.SqlCeConnectionFactory System.Data.Entity.Infrastructure.LocalDbConnectionFactory System.Data.Entity.InfrastructureSqlConnectionFactory:thesr 3種類でimplmentedさ

public interface IDbConnectionFactory 

を参照してください

ここでは、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; 
    } 
関連する問題