27

DataModel が ADo.NET エンティティ モデルをホストし、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" />

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

どんな助けでも大歓迎です。いつもありがとうございます:)。

4

8 に答える 8

26

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

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

于 2009-07-11T22:03:19.753 に答える
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()を呼び出すだけです。

于 2010-12-28T19:44:44.653 に答える
2

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

于 2010-07-16T04:27:40.147 に答える
1

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

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

于 2010-11-16T11:26:29.310 に答える
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" /> 
于 2010-01-27T12:41:08.253 に答える
0

私は同じ問題を抱えており、言及されたすべての方法を試しました。最後に、前述のように解決しました。私の場合、データ層とプレゼンテーション層が分かれています。私の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;" />

上記と同じ例外が発生します。そのため、web 構成ファイルに 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>
于 2013-11-13T19:22:41.397 に答える
0

エンティティ フレームワーク接続文字列がジョブ、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) { }

于 2015-09-29T15:21:05.840 に答える
0

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

于 2010-07-06T22:32:49.290 に答える