27

DataModelがADo.NETエンティティモデルをホストし、DataAccessレイヤが検証を行う複数レイヤプロジェクトを使用しています。複数のプロジェクトのADO.NETエンティティ接続文字列

は、しかし、毎回私が指定した名前の接続がいずれかの構成では見られないこの

のようなエラーが、EntityClientプロバイダ、または有効でないと使用することを意図していない取得します。私は、接続文字列に

<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

を試してみました

も呼ばれるプロジェクトディレクトリが、運のルートディレクトリを参照するために他の組み合わせを試してみました。

ご協力いただきまして誠にありがとうございます。いつものように多くのありがとう:)

答えて

25

各アプリケーションapp.configファイルにこれらの接続文字列を配置する必要があります。モデルを生成したDALを持っていて、EXEでDALを消費しようとすると、同じことが起こります。 EXEは接続文字列を認識しません。

私が見つけたもっとも簡単なことは、各プロジェクトにapp.configを配置し、DALから接続文字列をコピーするだけです。元のモデルを生成しました。次に、それぞれに同じ接続文字列のコピーが作成されます。

+3

HMを、のConnectionStringすることは、1つの場所ですべての接続文字列を格納し、その接続文字列を見つけるために、すべてのweb.configファイルに「伝える」することが何とか可能ですか? – Tony

+0

MACHINE.CONFIG(マシン上のグローバル)に置くことができますが、これにはより多くのprivが必要であり、そのシナリオでは配備は良い考えではありません。 –

+1

部分クラスを使用すると、エンティティ用に生成されたデータコンテキストの独自のコンストラクタを作成し、必要に応じて接続文字列を設定できます。また、データコンテキストをインスタンス化する特定のコンストラクターを呼び出す必要があります。 – jcmcbeth

0

DALの単体テストに同じ問題を追加します。これが機能することを、私を見つけた:

<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
0

私はWinFormsのプロジェクトと同様の問題があったと私は削除されるまで、私はウェブ上でそれに関連見つけることができるすべてのものを試しにもかかわらず、.....私の問題を解決できませんでした私のObjectContext(プライベートCubEntities _oc =新しいCubEntities())私のBaseFormから実際のフォームを使用して使用していたフィールド。あなたがメインプロジェクトにあなたのApp.Configファイルをコピーして、通常の'文字ですべて&quot;を交換する場合

2

それは私が今のObjectContextクラスとその作業のすべてのインスタンスにentityconnectionstringを渡さ

1

を実行する必要があります。

しかし、その、あまりにも多くのオーバーヘッド、たconnectionStringを持つプロパティを作成し、各インスタンスにパラメータとして

2

を渡し、私は上記の提案に若干の変化を示唆しています。

これは大きな改善ではありませんが、少なくともそれは懸念のいくつかの分離を与えます。

EFウィザードで.edmxファイルと関連付けられた.Designer .csファイルが作成されると、C#コードで部分クラスが宣言されます。したがって、別の.csファイルを2つのEDMファイルを含むプロジェクトに追加するだけです。

この新しいファイルは、同じ名前空間とクラスに対して追加の静的関数を定義します。

この新しい静的関数は、目的の型(ObjectContextの子孫)のインスタンスを返します。

新しいファイルは別のファイルなので、.edmxおよび.Designer.csを再作成すると上書きされません。

EDMプロジェクトの.configの接続文字列をコピーして貼り付けます。これはハックのようなものですが、少なくとも接続文字列はEDMプロジェクトに隠しておく必要があります。

新しいファイルは次のようになります。

namespace MyNamespace 
{ 
    public partial class MyEntities : ObjectContext 
    { 
    public static MyEntities New_MyEntities() 
    { 
     string connStr; 
     MyEntities theContext; 

     connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\""; 
     // set the connection string 

     theContext = new MyEntities(connStr); 
     // allocate it 

     return theContext; 
     // return it 
    } 
    } 
} 

は、新しいエンティティオブジェクトを取得するには、単にあなたの呼び出し元のプロジェクトから静的関数New_MyEntities()を呼び出します。

0

私は同じ問題があります&私はすべて上記の方法を試しました。私はそれを解決しました。私の場合は、データレイヤーとプレゼンテーションレイヤーが別々になっています。私のapp.config(データ層)に私はこのような接続を持っています。私web.config私手動で設定した接続で

<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

は、次のように、上述したよう

<add name="DefaultConnection" providerName="System.Data.SqlClient" 
connectionString="Data Source=abc; 
Initial Catalog=LibraryMgtSys; 
Integrated Security=SSPI; 
user id=sa;password=123;" /> 

それは私に同じ例外を提供します。だから、私はWeb configファイルにapp.configの値を追加して解決しました。

私の最終web.configファイルを次のように

<connectionStrings> 
    <clear /> 
    <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
     connectionString="Data Source=abc; 
     Initial Catalog=LibraryMgtSys; 
     Integrated Security=SSPI; 
     user id=sa;password=123;" /> 
    </connectionStrings> 
0

エンティティフレームワーク接続文字列は、ジョブによって必要とされたように私は、私のプロジェクトの一つで、Webアプリケーションとテストプロジェクトを問題がありました。これに対処する方法の1つは次のとおりです。

1)UnitOfWork(または同様の)パターンを使用します。これは、データコンテキストの作成を制御し、操作することを可能にする接続文字列

public partial class MyContext 
{ 
    #region Members 
    private static readonly object objSync = new object(); 
    private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance"; 
    // TODO: read from a place accesible to all deployed projects 
    // remove hardcoded database 
    private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'"; 

    private static string connectionString; 
    #endregion 

    public MyContext(String connectionString) : base(connectionString) 
    { 
    } 

    /// <summary> 
    /// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique 
    /// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps) 
    /// </summary> 
    public static MyContext Instance 
    { 
     get 
     { 
      // Dirty (non thread-safe) check 
      if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
      { 
       lock (objSync) 
       { 
        // Thread-safe check 
        if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
        { 
         MyContext context = new MyContext(DefaultConnectionString); 
         connectionString = context.Database.Connection.ConnectionString; 
         UnitOfWorkStore.SetData(DATACONTEXT_KEY, context); 
        } 
       } 
      } 
      return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY); 
     } 
    } 

} 
  • データコンテキストは、直接接続文字列入力可能にすべきである:

    公衆あるMyContext(文字列れたconnectionString):ベース( ) {}

  • 関連する問題