39

Entity Framework 4.0 RC を使用しているときに例外が発生しました。私の Entity Framework モデルは、Procurement.EFDataProvider という名前のプライベート アセンブリにカプセル化されており、POCO クラスは別のアセンブリ Procurement.Core 内にあります。コア (ビジネス ロジック) と EFDataProvider (データ アクセス) の間の関係は、DataProvider という名前のファクトリです。

オブジェクトセットを作成しようとすると

objectSet = ObjectContext.CreateObjectSet<TEntity>();

エラーが発生します:

EntityType 'Procurement.Core.Entities.OrganizationChart' のマッピングおよびメタデータ情報が見つかりませんでした。

4

13 に答える 13

63

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

  • プロパティのスペルミス (大文字と小文字が区別されます!)
  • POCO クラスにないプロパティ
  • POCO とエンティティ タイプの間のタイプの不一致 (例: long ではなく int)
  • POCO の列挙型 (私が理解しているように、EF は現在列挙型をサポートしていません)

他にも原因があるかもしれません。

HTH

于 2010-08-09T11:33:55.493 に答える
12

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

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

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

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

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

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

ObjectContext.Metadataworkspace.LoadFromAssembly();
于 2010-03-01T05:13:53.110 に答える
3

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

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

于 2011-05-20T02:48:16.190 に答える
2

構成ファイルで接続文字列が指定されていない場合にも発生しました。

于 2012-01-07T01:02:56.780 に答える
2

カスタム名前空間を適切に使用せずに同じアセンブリに複数の 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.
于 2011-07-28T15:16:16.833 に答える
1

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

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

于 2012-06-24T14:13:04.070 に答える
1

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

ソリューションの参照にいくつかの障害があることがわかりました。私のプロジェクトでは、edmxは というプロジェクトに属していDataAccess.Dllます。しかし、私は私のexeからそれを参照していません。私のexeから、 という別のプロジェクトへの参照がBusiness.Dllあり、このプロジェクトには の参照と古い場所がありDataAccess.DLLます。

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

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

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

于 2012-01-20T11:22:38.747 に答える
1

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

于 2010-07-13T18:12:01.210 に答える
0

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

于 2013-06-04T14:41:34.060 に答える
0

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

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

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

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

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

于 2012-05-02T10:18:24.873 に答える
0

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

于 2012-02-08T18:36:02.923 に答える
0

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

于 2012-04-27T20:38:57.577 に答える