web-dev-qa-db-ja.com

EntityTypeエラーのEFマッピングとメタデータ情報が見つかりませんでした

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'のマッピングおよびメタデータ情報が見つかりませんでした。

38
Reza Zareian

エラーを処理している他の人にとって、この(非常に役に立たない)エラーを引き起こすいくつかのシナリオに言及する価値があると思います。

  • スペルミスのプロパティ(大文字と小文字が区別されます!)
  • POCOクラスにプロパティがありません
  • POCOとエンティティタイプのタイプの不一致(たとえば、longではなくint)
  • POCOの列挙型(EFは現時点では列挙型をサポートしていません)

他の原因もあります。

HTH

61
joniba

これはおそらく、EFが埋め込みマッピング情報を見つけることができないためです。接続文字列の中には、おそらく彼のようなものがあります:

metadata=res://*/Models.MyModels.csdl|...etc

その*はワイルドカードであり、ロードされたすべてのアセンブリをスキャンして、埋め込まれたマッピング情報を検索しようとするようにオブジェクトコンテキストに指示します。アセンブリが読み込まれていない場合、EFはそれを見つけられません。

行う必要があるのは、マッピング情報が埋め込まれている場所に関する詳細情報を接続文字列に提供することです。 *をマッピングコードの特定のアセンブリ名に変更します。

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl

それが失敗した場合は、アセンブリを見つけて、次を使用してObjectContextに直接読み込みます。

ObjectContext.Metadataworkspace.LoadFromAssembly();
12
John Farrell

上記とは直接関係ありませんが、このエラーメッセージが表示され、POCOと通常のモデルが混在している場合:悪い考えです!

EF4 POCO(T4を使用しない)でJRoppertからのコメントも参照してください:EntityType のマッピングおよびメタデータ情報が見つかりませんでした(JRoppertに感謝!)

3
Roy de Boer

カスタムネームスペースを適切に使用せずに、同じアセンブリに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.
2
Ken

別の考えられる問題は、code-firstを使用しており、エンティティタイプが別のAssemblyコンテキストが定義され、OnModelCreating(DbModelBuild modelBuilder)メソッドにカスタムマッピングを追加していない場合、EFはデータアノテーションを無視しているようです。

解決策:

modelBuilder.Entity<YourEntityType>();メソッドにOnModelCreating(DbModelBuild modelBuilder)を追加します。

関連記事

2
Danny Varod

接続文字列が設定ファイルで指定されていないときにも見ました。

2
Anish

別の理由があるかもしれません。私も一晩髪を引っ張った。

解決策の参考文献に何らかの混乱があることがわかりました。私のプロジェクトでは、edmxDataAccess.Dllというプロジェクトに属します。しかし、私は私のexeからそれへの参照を持っていません。 exeからBusiness.Dllという別のプロジェクトへの参照があり、このプロジェクトにはDataAccess.DLLの参照と古い場所があります。

次のテストを行って、このような問題があるかどうかを確認します。

  1. Exeプロジェクトのbin directorを開き、表示したままにします。
  2. ソリューションを構築します。
  3. ビルドされる最初のプロジェクトはデータアクセスプロジェクトであり、binフォルダーで変更された日付として現在の時刻を確認できます。
  4. 他のプロジェクトがビルドされている間、DataAccessプロジェクトの変更日が古いものに変更されていることがわかります。

参照を確認し、参照がDLLの更新場所を参照していることを確認する必要があります。

1
Jacob Wakeem

モデルでプロパティのスペルを確認するだけです

1
soumitra ghosh

私の場合、それは本質的に同じ問題であり、マッピングは予想どおりではありませんでした。私に起こったことは、「テーブルごとの階層継承」のプロパティをサブクラスの1つから基本クラスに移動し、モデルの更新を忘れていたことです。

カスタムPOCOを使用して、edmxファイルを空の新しいプロジェクトにコピーし、エンティティを自動生成して、違いを見つけるのに役立ったものと比較します。

1
aishelm

noobの間違いですが、DBへのアクセスに読み取り専用のユーザー名とパスワードを使用するとエラーが発生しました。私の間違いが他の人を助けることを願っています。

0
Ammar

テーブルにいくつかの列を追加したときに問題が発生しました。

テーブルマッピングで、列名を変更しました。

「すべてのテンプレートを変換」を実行してアプリケーションを再構築しましたが、「タイプ<>の関連メタデータタイプには次の不明なプロパティまたはフィールド<>が含まれています」というエラーが表示されました。

Domain.Poco.ttのこのテーブルのクラスは正しいのですが、Domain.Poco.MetaData.ttの対応するclass.Metadata.csファイルが更新されておらず、新しい列ではなく元の名前であることがわかりました。テーブルマッピングで指定したもの。

解決?問題のメタデータクラスを削除し、「すべてのテンプレートを変換」を再実行したところ、正しい列/関数名で正しく再作成されました。

0
cyberspy

同様の問題がありました。 POCOクラスと自分で作成したContextオブジェクトを使用して、1つのデータベースに1つのEDMXファイルが既にありました。別のデータベースに2つ目のEDMXを追加したとき、POCO T4テンプレートを使用しましたが、どちらのEDMXも機能せず、言及したエラーをスローしました。それを解決するために、私はカスタムPOCOとコンテキストを廃棄し、T4テンプレートのみを使用しましたが、すべて正常に機能しました。

0
Walter

私の問題は、「msrepl_tran_version」という名前の複製フィールドを除外するようにT4テンプレートを編集していたことです。これにより、データベースが生成されたクラスと一致しなくなり、このエラーメッセージが表示される可能性がありました。データベースとクラスが一致することを確認してください。

0
WVDominick