2011-01-26 9 views
63

エンティティフレームワークのコードファーストDbContextに接続文字列を渡すにはどうすればよいですか? DbContextとweb.configの接続文字列が同じプロジェクトにあり、同じ方法で名前が付けられている場合、データベースの生成は正しく機能します。私は次のように接続文字列を渡してテストしていますので、しかし、今、私は別のプロジェクトにDbContextを移動する必要があります。接続文字列をコードファーストDbContextに渡す

モデル&コンテキスト

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

アクション

public ActionResult Index() 
    { 
     var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString); 

     var dinners = (from d in db.Dinners 
         select d).ToList(); 
     return View(dinners); 
    } 

Web.Config

<connectionStrings> 
    <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>  
</connectionStrings> 

解析するアクションにブレークポイントを設定すると、dbは接続文字列がありますが、データベースなどの作成や検索は行われません。

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

+0

は、あなたが正しいサーバーに接続している絶対によろしいですか?このエラーは、典型的なSQL Server/Expressの例外です。あなたがSql CEデータベースに接続しているようには聞こえません... EF Codeは、存在しなければデータベースを作成します。パスが見つからない場合は... –

答えて

54

ドキュメントを読んだ後、私は代わりに、接続文字列の名前を渡す必要があり:

var db = new NerdDinners("NerdDinnerDb"); 
+0

私はそれを私のコンストラクタに入れて、他の場所で参照する必要がある場合に備えてそれを公開定数にしました。 –

1

web.configの接続文字列の構文を確認してください。

+0

接続文字列は彼らは両方とも同じプロジェクトで同じ名前を使用します。 –

+0

DbConextに手作業で渡したいときに動作しません –

+0

接続文字列は問題ありません。絶対パスである必要はありません。 –

1

EFモデルを使用する場合、EFモデルを使用する各プロジェクトに接続文字列があります。たとえば、別のクラスライブラリにEF EDMXモデルがあります。 Web(mvc)プロジェクトに1つの接続文字列があり、EF dbにアクセスできます。

また、リポジトリをテストするための別の単体テストプロジェクトもあります。リポジトリがEF dbにアクセスするためには、テストプロジェクトのapp.configファイルには同じ接続文字列があります。

DB接続は、コード化されていないIMOで構成する必要があります。

+2

コードで接続文字列を手動で渡す必要があります。私は依存性注入を使用しています。 –

0

コードに間違いはありません。私はSqlExpressを使用し、コンストラクタで接続文字列を使用するとうまく動作します。

プロジェクトにApp_Dataフォルダが作成されていますか?

1

あなたはアプリ内で接続文字列を構築しているなら、あなたはCONNSTRINGのあなたのコマンドを使用します。 Web設定で接続文字列を使用している場合。次に、その文字列の "名前"を使用します。

36

私は、「DbContextに接続文字列を渡す方法」を探している人にこのビットを追加します:基本データストアの接続文字列を作成し、接続文字列全体をあなたのコンストラクタに渡すことができますDbContextから派生した型。

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
} 

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
     : base(connString) 
    { 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 

その後 モデル&コンテキスト(@Lolコーダーからコードを再使用)

は、あなたが使用してSQL接続文字列を構築すると言うので、同様SqlConnectioStringBuilder:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString()); 

GetConnectionStringメソッドは適切な接続文字列を作成し、SqlConnectionStringBuilderは接続文字列が構文上正しいことを確認します。少し遅れて、ここでゲームに

var myContext = new NerdDinners(builder.ToString()); 
+4

実際に接続文字列をハードコードするには、次のようにします: 'public TestAppContext():base("データソース= server.company.com;初期カタログ= SomeDB;統合セキュリティ= True "){}' –

59

が、別のオプションは次のとおりです:あなたはそのようにのようなあなたのdb conetxtをインスタンス化して、あなたのDbContextで

public class NerdDinners : DbContext 
{ 
    public NerdDinners(string connString) 
    { 
     this.Database.Connection.ConnectionString = connString; 
    } 
    public DbSet<Dinner> Dinners { get; set; } 
} 
+2

こんにちは! これは私をどこかに連れて来た唯一の解決策でした。私の問題は、Web.configではなくAzure設定ファイルから設定を取りたいということです。それでも、「プロバイダ」の設定がないため(Web.configの属性として設定されているため)、この方法では機能しません。何か案は? – user

+1

優秀な回答!変更はconnStringパラメータを削除して、アプリケーション設定に保存された接続文字列を使用することでした.... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString – usefulBee

+0

connStringとDbCompiledModelオブジェクトの両方を渡す方法パラメータと同時に? –

20

、あなたのDbContextと継承のためのデフォルトのコンストラクタを作成しますこのようなベース:

public myDbContext() 
     : base("MyConnectionString") // connectionstring name define in your web.config 
    { 
    } 
関連する問題