web-dev-qa-db-ja.com

複数のプロジェクトのADO.NETエンティティ接続文字列

DataModelがADo.NETEntityモデルをホストし、DataAccessレイヤーが検証を行う複数レイヤープロジェクトを使用しています。

しかし、私はこのようなエラーを受け取るたびに

指定された名前付き接続が構成に見つからないか、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" />

また、呼び出されたプロジェクトディレクトリのルートディレクトリを参照するために他の組み合わせを試しましたが、うまくいきませんでした。

どんな助けでも大歓迎です。いつものようにどうもありがとう:)。

27
Sumanta

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

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

25
Jason Short

上記の提案に少し変更を加えることをお勧めします。

これは大きな改善ではありませんが、少なくとも関心の分離が得られます。

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

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

この新しい静的関数は、目的のタイプ(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()を呼び出すだけです。

2
MindModel

App.Configファイルをメインプロジェクトにコピーし、すべての&quot;を通常の'文字に置き換えると実行されます

2
keith

EntityconnectionstringをobjectContextクラスのすべてのインスタンスに渡し、現在は機能しています。

ただし、オーバーヘッドが大きすぎるため、connectionstringを使用してプロパティを作成し、それをパラメーターとして各インスタンスに渡します。

1
Balaji B

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
D.Thouvenin

私は同じ問題を抱えていました、そして私は言及されたすべての方法を試しました。ついに私は前述のようにそれを解決しました。私の場合、データ層とプレゼンテーション層が別々になっています。私のapp.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" />

私のweb.config次のように手動で接続を構成しました。

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

上記と同じ例外が発生します。だから私はウェブ設定ファイルに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
DevT

WinFormsプロジェクトでも同様の問題が発生し、Web上でプロジェクトに関連するすべてのことを試しても、ObjectContextに使用していたフィールドを削除するまで問題を解決できませんでした(private CubEntities _oc = new BaseFormからそれを使用する実際のフォームへのCubEntities())。

0
daveywc

エンティティフレームワークの接続文字列がジョブ、Webアプリケーション、およびテストプロジェクトで必要だったため、プロジェクトの1つで問題が発生しました。これに対処する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);
        }
    }

}
  1. データコンテキストでは、直接接続文字列の入力を許可する必要があります。

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

0
Alexei