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="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
そして
<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
また、呼び出されたプロジェクトディレクトリのルートディレクトリを参照するために他の組み合わせを試しましたが、うまくいきませんでした。
どんな助けでも大歓迎です。いつものようにどうもありがとう:)。
これらの接続文字列を各アプリケーションのapp.configファイルに配置する必要があります。モデルを生成したDALがあり、EXEでDALを使用しようとすると、同じことが起こります。 EXEは接続文字列を認識していません。
私が見つけた最も簡単なことは、各プロジェクトにapp.configを配置し、最初にモデルを生成したDALから接続文字列をコピーすることです。次に、それぞれに同じ接続文字列のコピーがあります。
上記の提案に少し変更を加えることをお勧めします。
これは大きな改善ではありませんが、少なくとも関心の分離が得られます。
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()を呼び出すだけです。
App.Config
ファイルをメインプロジェクトにコピーし、すべての"
を通常の'
文字に置き換えると実行されます
EntityconnectionstringをobjectContextクラスのすべてのインスタンスに渡し、現在は機能しています。
ただし、オーバーヘッドが大きすぎるため、connectionstringを使用してプロパティを作成し、それをパラメーターとして各インスタンスに渡します。
DALの単体テストを試みて、同じ問題を追加します。私はこれがうまくいくことを発見しました:
<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
私は同じ問題を抱えていました、そして私は言及されたすべての方法を試しました。ついに私は前述のようにそれを解決しました。私の場合、データ層とプレゼンテーション層が別々になっています。私のapp.config
(データレイヤー)私はこのような接続を持っています。
<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string="data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True"" 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="data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True"" 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>
WinFormsプロジェクトでも同様の問題が発生し、Web上でプロジェクトに関連するすべてのことを試しても、ObjectContextに使用していたフィールドを削除するまで問題を解決できませんでした(private CubEntities _oc = new BaseFormからそれを使用する実際のフォームへのCubEntities())。
エンティティフレームワークの接続文字列がジョブ、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);
}
}
}
データコンテキストでは、直接接続文字列の入力を許可する必要があります。
public MyContext(String connectionString):base(connectionString){}