2009-06-11 16 views
15

私たちは、コンソールアプリケーションプロジェクトとWebアプリケーションプロジェクトという2つのプロジェクトからなるソリューションを用意しています。これらはそれぞれスキーマは同一ですが、同じデータベースにアクセスするために使用される.edmxファイルとは異なります。Entity Frameworkエラー - 「EntityContainer名は一意でなければなりません」

コンソールアプリケーションは、Webアプリケーションがホストされているのと同じサーバー上でスケジュールされたタスクとして実行されます。 Webアプリケーションには、コンソールアプリケーションのメソッドが呼び出されるため、Webアプリケーション内の特定のアクションが呼び出されるため、コンソールアプリケーションへの参照が含まれています。 この組み合わせは、ステージング環境で何ヶ月も正常に実行されています。

ライブリリースしたとき、我々は、少なくとも一日一回、次のエラーメッセージが表示されます。指定された

スキーマが有効ではありません。エラー:

ProjectName.csdl(3,4):エラー0019:EntityContainerの名前は、 ユニークである必要があります。 「ProjectEntities」という名前のEntityContainerはすでに が定義されています。 ProjectName.csdl(63,4):エラー0019: スキーマの各タイプ名は一意である必要があります。タイプ名 'ProjectModel.DataSource'は既に が定義されています。 ProjectName.csdl(75,4):エラー0019: スキーマの各タイプ名は一意である必要があります。タイプ名「ProjectModel.Error」はすでに が定義されています。

これで、スキーマのすべてのタイプ名がリストされます。

このエラーは、アプリケーションプールをリサイクルまたはIISを再起動することで解決できます。

Webアプリケーションがしばらく実行されていない限り、エラーは発生しません。コンパイル時または初めてアプリケーションにアクセスするときにエラーが発生していないことに注意してください。

私の最初の理論は、Webアプリケーションがコンソールアプリケーションを参照するため、2つのエンティティコンテナが互いに競合しているということでしたが、異なる名前を持っていたため「EntityContainer名は一意でなければなりません。 'ProjectEntities'はすでに「混乱している」と定義されています。

+0

このリンク[1]を確認してください:http://stackoverflow.com/questions/4898794/the-entitycontainer-name-must-be-unique-in-different-assemblies、これは私のために働く。私はあなたを助けて欲しい! –

答えて

15

これまで、この問題に直面したとき、私は常に、エンティティモデルを含む3番目の共有ライブラリを作成しました。新しいテーブルを追加する場合、名前の競合は起こりません/列/メソッドを1回だけなど必要なモデルに変換します。

+0

これは問題を解決するために取ったアプローチです。 – ENX

+0

@ENXおそらくそれを答えとしてマークすることができます。 – icelava

+0

@icelava - @ ENX'sは1年半以上見られていませんでした。(回答を強化するためにいつも投票することができます;) –

2

このエラーは、単一のDLLまたはクラスライブラリプロジェクトに複数のエンティティmodel.edmxファイルがある場合に発生します。エラーの原因はわかっていませんが、他のモデルを削除するか、別のmodel.edmxファイルを別のクラスライブラリに移動することで修正できます。

はまた、以前のDLLの参照を削除することを忘れてはいけない

2

まあ、私の場合、私はdiferentプロジェクト(DLL)を持っているので、彼らは、同じデータベースへのアクセスが、私、diferentソフトウェアアーキテクチャを働いています内部には異なるエンティティがあります。だから、私はそれらのすべてまたは少なくとも2つを必要とするプロジェクトで参照がある場合、私はこのエラーが表示されます

それぞれのエンティティコンテナ名を変更すると、私は問題を解決するが、今私の接続文字列は異なる私が参照する各DLLの設定ファイルにすべての接続文字列を含める必要があります。

24

そのbinフォルダに移動し、dllとpdbファイルを手動で削除します。

+4

これは私のために働いた。私はクラスライブラリの名前を変更し、古いdllはbinフォルダに残っていました。 – wmcainsh

+0

これも私のために働いた! –

+0

これは私のために働いた、私は私のアプリケーションを公開するために使用しているフォルダ内のすべての古いDLLの存在を削除しました。 – ravithejag

0

エンティティコンテナの名前を以前に削除されたエンティティコンテナの名前に変更しようとすると、web.configまたはapp.configに移動して、設定セクションから接続文字列を削除する必要があります。

3

誰かが欲求不満で答えを見つけられない場合もあります。私は誤って2番目の場所にあるプロジェクトに含まれている.edmxファイルのコピーを作成しました。どちらもビルドに含まれていました。

;-)

これがあなたに起こった場合は、恐れることはない:あなたはまずありませんでした。

0

私のためのBinフォルダは隠されていたので、隠しファイルを表示し、古いdll/pdbを削除して、必要なものをプロジェクトに含めなければなりませんでした。再建された作品。

5

変更

metadata=res://MyProject/App_Code.AAA.csdl|res://MyProject/App_Code.AAA.ssdl|res://MyProject/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 
+0

これは私の状況では完全に機能しました:1つのアプリケーションは、同じモデルライブラリへの "ILMerged"リファレンスを含む2つのライブラリ(プラグインアーキテクチャの種類)を使用します。どうもありがとう。 –

0

にこの

metadata=res://*/App_Code.AAA.csdl|res://*/App_Code.AAA.ssdl|res://*/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient 

からのWebConfigファイル実体の接続文字列エントリ私はによってEntityFramework 6.0でこの問題を修正しました。

  1. モデルの作成時に、エンティティの名前に.edmxという名前を付けます。すなわち(MYDbEntities)

  2. 作成後、私はMYDbEntities.Context.csを開き、 "Entities"クラスを "MYDbEntities"に変更しました。

  3. App.Configを開き、接続文字列を探します。
  4. MYDbEntities.Context.csを開き、接続文字列を設定から接続文字列に変更します。たとえば "MyDbConnection"
  5. は、接続文字列は、この

    メタデータ= resをのようなものであることを確認してください:// /MYDbEntities.csdl|res:// /MYDbEntities.ssdl|res://*/MYDbEntitiesユーザー名= sa;パスワード= Sw0rdf!sh; multipleactiveresultsets = True;アプリケーション名= True;ユーザーID = sa;パスワード= Sw0rdf!sh; multipleactiveresults = True;アプリケーション名= EntityFramework "

注:私のエンティティは別のDLLにあります。

これが役に立ちます。