2009-08-24 9 views
6

私は2つのプロジェクト含む.NETソリューションがあります。2つの.NETプロジェクト、1つのDB接続文字列?

  • アンASP.NET MVCプロジェクト、 'ウェブサイト'
  • クラスライブラリを、 'モデル'

'モデル' プロジェクトが含まれていますLinqからSQLへのデータ・コンテキストと、データベース・オブジェクトを拡張するいくつかの部分クラスから構成されています。

接続文字列は、 'Website'プロジェクトのweb.configで定義されています。

しかし、 'Models'プロジェクトにはデータベース接続が別に定義されている独自のapp.configがあるようです。

これは、接続文字列が変更された場合、両方のプロジェクトを更新する必要があることを意味します。

接続文字列を一箇所に集約して、どちらのプロジェクトでも使用できる方法はありますか?

答えて

4

データコンテキストと同じ部分クラスを作成し、このコードを使用してapp.configとは対照的にweb.config文字列を強制的に使用します。部分クラスをクラスライブラリのモデルと同じ場所に配置します。

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

Preferred Method for connection string in class library
詳細は、この質問を参照してくださいRichardODは、私は最高のは、私たちの問題LINQ To SQL and the Web.Config ConnectionString Value

+0

下への投票は何ですか? – Breadtruck

+2

しかし、部分クラスは同じアセンブリに属していなければならないので、これはどのように機能しますか?私は、 'モデル'アセンブリが 'ウェブサイト'アセンブリのweb.configからの接続文字列を使用するようにします。 – Jonathan

+0

ところで、私はダウンワードをしなかった。 – Jonathan

1

私は、Webプロジェクトのweb.configに製品の設定を保存し、使用している設定をモデルプロジェクトに注入する必要があると思います。

+0

これは私が行うことです。実際のコード例については私の答えを見てください。 – Breadtruck

2

これは問題ありません。モデルの接続文字列をWeb.configに置き、モデルの設定ファイルを忘れる(削除する)。

あなたも(おそらくない1行にかかわらず)それをこのように指定することができるようにDataContextはまた、そのコンストラクタに接続文字列を取ります。

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

編集 - 他の回答にコメントをもとに、それが見えますあなたが何か間違っているように。これを行うと、生成されたコードはデフォルトの設定値を使用します。

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

あなたは、Web.configファイルにnot specifying the connection string properlyの間違いを犯している可能性があります。

+0

@リチャード:私はコメントしていますが、私は実際にこの質問をしませんでした。私はappconfigファイルを削除しようとしたことはありません。私の叔母はそれを提案しましたが、私もプロジェクトでいくつかのデータセットモデルを持っていました。この場合、多くの部分的なテーブルアダプタークラスを作成しなければなりませんでした。私はそれが動作すると思います。 – Breadtruck

0

ここでは推測していますが、どちらのプロジェクトも同じ接続文字列を使用しているようです。

この場合、web.configファイルで接続文字列を指定するだけです。とにかくクラスライブラリapp.configはASP.NETで読み取られません。

+0

何か設定が間違っていない限り、それは私の経験ではありません。 – Breadtruck

+0

本当ですか?あなたのためにそれを行うサードパーティのコンポーネントを使用していますか?私の経験では、実行可能ファイル(またはASP.NET web.configの場合)のapp.configは、デフォルトでシステムによって読み取られるためです。 app.configがクラスライブラリ(.DLL)に関連付けられている場合、そのapp.configの内容は、A)手動でロードされているか(これを行うサードパーティのコンポーネントか)、またはB)メインアプリケーションのapp.config/web.config – Randolpho

+0

@Randolpho:それは私に関連するので、より明確にするためにhttp://stackoverflow.com/questions/1148559を参照してください。 – Breadtruck

0

モデルライブラリの接続文字列は、デザイナーだけが使用していると思います。実行時に、文字列はweb.configからロードされます。したがって、必ずしも文字列を同期させる必要はありません。

+0

これは、このようなソリューションを本番環境に導入した後に私が見つけたものではありません。ライブラリは引き続きapp.configから接続を引き出しました。 – Breadtruck

0

を説明しますが、クラスライブラリのapp.configを必要としない何を考えへのリンクを掲載しました。あなたの設定をweb.configに入れてください。また、ライブラリのアプリケーションからいくつかの設定セクションが必要な場合。configをweb.configに入れてください。 ConfigurationManagerはそこからそれを読み取ります。

0

Webアプリケーションでモデルクラスライブラリが参照されている場合は、App.Configファイル内の参照を削除し、Webに配置されているものと似ているかどうかを確認するだけです。 config。こうすれば、コンパイラがweb.configを見ると、MVCプロジェクトに必要な接続文字列が見つかるので、それをさらに調べる必要はありません。

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

私のリポジトリをインスタンス化することができると私は接続を設定、または全くそれに対処することを心配することはありませんその方法:

+0

これを試しましたが、モデルプロジェクトのプロパティの下にある「設定」ファイルから接続文字列が取得されているようです。このようなコードがクラスにあります: 'global :: Models.Properties.Settings.Default.WebConnectionString、mappingSource)' – Jonathan

+0

@jonathanconroy:これは私の答えがこの問題を回避するのに役立つのです。 – Breadtruck

0

は個人的に、私はその後のような何かを私のレポジトリでのDataContextを拡張します。 dev/liveデータベースに/から変更するには、web.configを変更するだけです。

0

ライブラリ内のapp.configは実際には生成されません。これらの接続文字列は実際にはlinq2sqlデザイナーのために存在します。目に見えるものはありません。移動してください。これは、私たちが探しているドロイドではありません。 。 。

関連する問題