少しの背景:
私はDLLプロジェクトを次の構造で持っています:
Rivworks.Model (project)
\Negotiation (folder)
Model.edmx (model from DB #1)
\NegotiationAutos (folder)
Model.edmx (model from DB #2)
接続文字列をこのプロジェクトのapp.configからweb.configファイルに移動しました。これらは、ConnectionStringセクションではnotです。むしろ、web.configの一部を消費し、AppSettings。[settingName]としてアプリに公開する静的クラスがあります。
<FeedAutosEntities_connString>metadata=res://*/;provider=System.Data.SqlClient;provider connection string='Data Source=db4;Initial Catalog=RivFeeds;Persist Security Info=True;User ID=****;Password="****";MultipleActiveResultSets=True'</FeedAutosEntities_connString>
<RivWorkEntities_connString>metadata=res://*/NegotiationAutos.NegotiationAutos.csdl|res://*/NegotiationAutos.NegotiationAutos.ssdl|res://*/NegotiationAutos.NegotiationAutos.msl;provider=System.Data.SqlClient;provider connection string='Data Source=db2;Initial Catalog=RivFramework_Dev;Persist Security Info=True;User ID=****;Password="****";MultipleActiveResultSets=True'</RivWorkEntities_connString>
各コンテキストに1つずつ、2つのクラスがあり、次のようになります。
namespace RivWorks.Model
{
public class RivWorksStore
{
private RivWorks.Model.Negotiation.Entities _dbNegotiation;
public RivWorksStore(string connectionString, string metadata, string provider)
{
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ConnectionString = connectionString;
entityBuilder.Metadata = "res://*/"; // metadata;
//entityBuilder.Provider = provider;
_dbNegotiation = new RivWorks.Model.Negotiation.Entities(entityBuilder.ConnectionString);
}
public RivWorks.Model.Negotiation.Entities NegotiationEntities()
{
return _dbNegotiation;
}
}
}
namespace RivWorks.Model
{
public class FeedStoreReadOnly
{
private RivWorks.Model.NegotiationAutos.Entities _dbFeed;
public FeedStoreReadOnly(string connectionString, string metadata, string provider)
{
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ConnectionString = connectionString;
entityBuilder.Metadata = "res://*/"; // metadata;
//entityBuilder.Provider = provider;
_dbFeed = new RivWorks.Model.NegotiationAutos.Entities(entityBuilder.ConnectionString);
}
public RivWorks.Model.NegotiationAutos.Entities ReadOnlyEntities()
{
return _dbFeed;
}
}
}
メタデータが短いバージョンに書き換えられていることに注意してください。
各クラスでその行をコメントアウトすると、次のエラーが表示されます。
指定されたメタデータリソースを読み込めません。
各クラスでその行を残すと、このエラーが発生します:
指定されたスキーマは無効です。エラー:
Negotiation.Model.csdl(3,4):エラー0019:EntityContainer名は一意である必要があります。 「エンティティ」という名前のEntityContainerはすでに定義されています。
私はそれが単純なもの、明白なものであることを知っています。どんな提案も歓迎します...
2つのEDMXファイルは、おそらく同じエンティティコンテナ名を持っています。 (少なくとも)それらの1つを変更する必要があります。
GUIデザイナーで、モデルブラウザーを開きます。 「EntityContainer:Entities」というノードを探します。クリックして。 [プロパティ]で、Name
を別のものに変更します。保存して再構築します。
エラーメッセージの上位のGoogle結果であるため、これをハイジャックします。
単一のモデル/コンテキストのみを使用しているときに他の誰かがこれに遭遇した場合:モデル/コンテキストを含むアセンブリの名前が変更され、以前の名前のコピーがアプリケーションのbinディレクトリに残っていたため、一度この問題に遭遇しました。解決策は、古いアセンブリファイルを削除することでした。
私も問題を抱えていましたが、私の解決策は、binディレクトリをクリーンアップしてから、エンティティコンテナ名の接続文字列を削除することでした。次に、エンティティの名前を変更し、接続文字列を戻すことができます。
プロジェクトの名前を変更しましたが、古いファイルはまだbinフォルダーにありました。古いbinフォルダから古いDLL=を削除する必要がありました。
私の場合、問題はWeb.configの接続文字列がエンティティコンテナクラスと同じ名前になっていることが原因でした。
変化する
<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah
に
<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah
ソリューションエクスプローラーでConflictingNameModel.Context.ttを右クリックし、[カスタムツールの実行]をクリックして、コンテナークラスを再生成します。
複数のコンテナを同じ名前(もちろん名前空間)で保存する方法を見つけました。
EF5およびVS2012では、3つの異なる名前空間を設定できます。まず、ソリューションブラウザーでedmxファイルをクリックし、プロパティウィンドウで「カスタムツールネームスペース」を設定できます。edmxのすぐ下にある* .Context.ttファイルをクリックして、そこに別のネームスペースを設定し、最後にStuntz氏の素晴らしい回答のおかげで、edmxファイルを開いて空白をクリックすると、プロパティウィンドウの[スキーマ]に別の名前空間フィールドが表示されることに気付きました。
完了したとは思いませんが、エンティティコンテナ名フィールドが表示され、そこで名前を変更しようとしますが、機能しないようです。ポップアップする小さなエラーが表示されます。すべてのedmxファイルに個別のネームスペースがあることを確認してください。 (3つの場所すべてに一意の名前空間があることを確認しました)
次に、モデルブラウザに移動し、EntityContainer:Entityを右クリックしてプロパティに移動し、コンテナの名前を変更します。どこからでも名前空間を設定したウィンドウから、同じ名前の複数のコンテキストを取得できました。私はblahcontextとblahcontextcontainerのようなものを扱っていましたが、それらは別々のフォルダーにありましたが。
それが名前空間の問題だとわかると。またはその欠如。
私はこれに出くわしました。 Entity Frameworkは、追加する必要があると考えたテーブルに関して、どういうわけか悪い状態になったように見えます。
通常、EFは、次の行を配置するまで新しいテーブルを作成する必要があることを認識しません。
public virtual DbSet<NewTable> NewTable { get; set; }
コンテキストクラス内。
しかし、EFは何らかの形で悪い状態に陥り、私のソリューションにNewTableクラスが存在するだけで、そのテーブルを生成する必要があると考えるようになりました。そのため、コンテキストの上記の行がNewTableテーブルを作成するようにトリガーするまでに、すでにそれが完了したと考えていたため、エンティティの重複に関するエラーが発生しました。
私はソリューションからNewTableクラスを削除し、コメントアウトして再度コンパイルできるようにコメントしました(ありがたいことに、あまり多くはありませんでした)。その後、物事がより予測可能な状態に戻ったら、NewTableクラスをソリューションに再度追加し、移行の追加は正常に機能しました。
Visual StudioからWeb展開を使用している場合、古いdllが削除されないことがあります。同じ問題があり、Web Deployment Packageに変更しましたが、問題は発生しませんでした。
エンティティ6.2.0、VS 2017、単一edmxの問題を解決するには
Model.edmxの名前を別の名前に変更し、プロジェクトをビルドしてから、元の名前に戻しました。
私の場合、おそらくバージョンを元に戻した後、スタートアッププロジェクトファイル(csproj)が破損しました。
追加されたすべてのEntityクラス:
<Compile Include="Class.cs">
<DependentUpon>MyModel.tt</DependentUpon>
</Compile>
すべての関連エントリを手動で削除した後、問題は解決しました。
私はasp.netウェブサイトで同じ問題を抱えていましたが、セミコロンを削除して意図的にアプリコードのcsファイルの1つにコンパイル時エラーを追加した問題を解決し、セミコロンを再度追加してコンパイルの問題を修正しました。
このプロセスにより、アプリケーションが再びコンパイルされました。このエラーが消えた後。
この問題の他の原因は、ソリューションプロジェクトにモデルを追加し、モデルプロジェクトを変更することです。
--PROJECT A --> MODEL.EDMX
--- WEB CONFIG -->Entity Connection
--PROJECT B
--- WEB CONFIG -->Entity Connection
後で、私はこの構造が悪いと思い、プロジェクトを変更します。
--PROJECT A
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING
--PROJECT B
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING
--PROJECT C (CLASS LIBRARY) --> MODEL.EDMX
--- APP.CONFIG -->Entity Connection
すべて順調でしたが、エラーが発生します。 エラーの詳細:EntityContainer名は一意である必要があります。「Entities」という名前のEntityContainerはすでに定義されています
Web.Configファイルを変更するのを忘れたからです。
OLD WEB.CONFIG
<add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
新しいWEB.CONFIG
<add name="donatelloEntities" connectionString="metadata=res://*/EntityModel.Model.csdl|res://*/EntityModel.Model.ssdl|res://*/EntityModel.Model.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
この問題は単純ですが、時間の損失を引き起こす可能性があります。例を挙げたかった。役に立てば幸いです。
ありがとう。