Entity Framework 4.0 RCを使用すると例外が発生しました。 Entity Frameworkモデルは、Procurement.EFDataProviderという名前のプライベートアセンブリにカプセル化され、POCOクラスは別のAssembly Procurement.Coreの内部にありますCore(ビジネスロジック)とEFDataProvider(データアクセス)の関係は、DataProviderという名前のファクトリです
オブジェクトセットを作成しようとすると
objectSet = ObjectContext.CreateObjectSet<TEntity>();
エラーが発生します:
EntityType 'Procurement.Core.Entities.OrganizationChart'のマッピングおよびメタデータ情報が見つかりませんでした。
エラーを処理している他の人にとって、この(非常に役に立たない)エラーを引き起こすいくつかのシナリオに言及する価値があると思います。
他の原因もあります。
HTH
これはおそらく、EFが埋め込みマッピング情報を見つけることができないためです。接続文字列の中には、おそらく彼のようなものがあります:
metadata=res://*/Models.MyModels.csdl|...etc
その*はワイルドカードであり、ロードされたすべてのアセンブリをスキャンして、埋め込まれたマッピング情報を検索しようとするようにオブジェクトコンテキストに指示します。アセンブリが読み込まれていない場合、EFはそれを見つけられません。
行う必要があるのは、マッピング情報が埋め込まれている場所に関する詳細情報を接続文字列に提供することです。 *をマッピングコードの特定のアセンブリ名に変更します。
metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl
それが失敗した場合は、アセンブリを見つけて、次を使用してObjectContextに直接読み込みます。
ObjectContext.Metadataworkspace.LoadFromAssembly();
上記とは直接関係ありませんが、このエラーメッセージが表示され、POCOと通常のモデルが混在している場合:悪い考えです!
EF4 POCO(T4を使用しない)でJRoppertからのコメントも参照してください:EntityType のマッピングおよびメタデータ情報が見つかりませんでした(JRoppertに感謝!)
カスタムネームスペースを適切に使用せずに、同じアセンブリにedmxファイルより多くのファイルがあったため、このエラーが発生していました。
System.Data.Objects.ObjectContextの例外について説明します
//例外:
// System.InvalidOperationException:
// When the System.Data.Metadata.Edm.EntitySet from entitySetName
// does not match the System.Data.Metadata.Edm.EntitySet of the object’s
// System.Data.EntityKey.
// -or-
// When the System.Data.Objects.ObjectContext.DefaultContainerName
// property is not set on the System.Data.Objects.ObjectContext and
// the name is not qualified as part of the entitySetName parameter.
// -or-
// When the specified type belongs to more than one entity set.
別の考えられる問題は、code-firstを使用しており、エンティティタイプが別のAssemblyコンテキストが定義され、OnModelCreating(DbModelBuild modelBuilder)
メソッドにカスタムマッピングを追加していない場合、EFはデータアノテーションを無視しているようです。
解決策:
modelBuilder.Entity<YourEntityType>();
メソッドにOnModelCreating(DbModelBuild modelBuilder)
を追加します。
関連記事 。
接続文字列が設定ファイルで指定されていないときにも見ました。
別の理由があるかもしれません。私も一晩髪を引っ張った。
解決策の参考文献に何らかの混乱があることがわかりました。私のプロジェクトでは、edmx
はDataAccess.Dll
というプロジェクトに属します。しかし、私は私のexeからそれへの参照を持っていません。 exeからBusiness.Dll
という別のプロジェクトへの参照があり、このプロジェクトにはDataAccess.DLL
の参照と古い場所があります。
次のテストを行って、このような問題があるかどうかを確認します。
参照を確認し、参照がDLLの更新場所を参照していることを確認する必要があります。
モデルでプロパティのスペルを確認するだけです
私の場合、それは本質的に同じ問題であり、マッピングは予想どおりではありませんでした。私に起こったことは、「テーブルごとの階層継承」のプロパティをサブクラスの1つから基本クラスに移動し、モデルの更新を忘れていたことです。
カスタムPOCOを使用して、edmxファイルを空の新しいプロジェクトにコピーし、エンティティを自動生成して、違いを見つけるのに役立ったものと比較します。
noobの間違いですが、DBへのアクセスに読み取り専用のユーザー名とパスワードを使用するとエラーが発生しました。私の間違いが他の人を助けることを願っています。
テーブルにいくつかの列を追加したときに問題が発生しました。
テーブルマッピングで、列名を変更しました。
「すべてのテンプレートを変換」を実行してアプリケーションを再構築しましたが、「タイプ<>の関連メタデータタイプには次の不明なプロパティまたはフィールド<>が含まれています」というエラーが表示されました。
Domain.Poco.ttのこのテーブルのクラスは正しいのですが、Domain.Poco.MetaData.ttの対応するclass.Metadata.csファイルが更新されておらず、新しい列ではなく元の名前であることがわかりました。テーブルマッピングで指定したもの。
解決?問題のメタデータクラスを削除し、「すべてのテンプレートを変換」を再実行したところ、正しい列/関数名で正しく再作成されました。
同様の問題がありました。 POCOクラスと自分で作成したContextオブジェクトを使用して、1つのデータベースに1つのEDMXファイルが既にありました。別のデータベースに2つ目のEDMXを追加したとき、POCO T4テンプレートを使用しましたが、どちらのEDMXも機能せず、言及したエラーをスローしました。それを解決するために、私はカスタムPOCOとコンテキストを廃棄し、T4テンプレートのみを使用しましたが、すべて正常に機能しました。
私の問題は、「msrepl_tran_version」という名前の複製フィールドを除外するようにT4テンプレートを編集していたことです。これにより、データベースが生成されたクラスと一致しなくなり、このエラーメッセージが表示される可能性がありました。データベースとクラスが一致することを確認してください。