web-dev-qa-db-ja.com

EF4のPOCOテンプレートの使用中に「メタデータ情報が見つかりません」?

EF4用のPOCOテンプレートをインストールしました。モデルに単一のエンティティAnnouncementTextがあり、T4ファイルが適切に生成されているようです。この新しいエンティティにアクセスしようとすると、自動生成されたプロパティMyObjectContext.AnnouncementTextsにアクセスすると、次のエラーがスローされます。

InvalidOperationException:EntityType'MyNamespace.AnnouncementText 'のマッピングおよびメタデータ情報が見つかりませんでした。

AnnouncementText POCOのプロパティはデータベースの列と一致しているようで、自動生成されたコードは変更していません。

スタックトレースは次のとおりです。

   at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
   at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
   at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
   at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
   at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14

ソリューションから.ttファイルを削除し、モデルでコード生成を有効にすると、問題なくプロパティにアクセスできます。

それが役立つかもしれない場合に備えて、これが私のコードです:

using (var context = new MyObjectContext())
   foreach (var at in context.AnnouncementTexts)
      Console.WriteLine(at.Title);

何が間違っているのかについてのアイデアはありますか?

23
ladenedge

最近、EDMXファイルをソリューションの新しい場所に移動しているときに、この同じエラーが再び発生しました。どうやら、EDMXファイルを扱うときはいくつかの異なる名前空間があります。最初のEDMXファイル(N1)を作成するときにウィザードを介して入力する名前空間があります。これは、SSDLに表示される次のような名前空間(N2)です。

<Schema Namespace="..." ..

次に、(オプションで)デザイナで指定できる生成されたコードの名前空間があり(N3)、最後に、最終的なアセンブリ(N4)にコンパイルされるリソースの非表示の名前空間があります。

私の知る限り、名前空間N2はSSDL内でのみ実際に関連しています。この名前空間は、N1-ウィザードに最初に入力した名前空間として始まると思います。

同様に、名前空間N3は、C#名前空間が通常ある方法でのみ関連します。

ここに問題のある部分があります。カテゴリN4名前空間はの関数ですEDMXが存在するディレクトリ(プロジェクトディレクトリに対して)。あなたは思うかもしれません、だから何?これらの名前空間はApp.configファイルでも参照されていることがわかりました。具体的には、次のような部分を探します。

connectionString="metadata=res://*/Database.Master.csdl|...

「Database.Master.csdl」と表示されている部分は、CSDLリソースの名前です。これらのリソース名が同期しなくなると、上記のようなエラーが発生するか、次のようなエラーが発生します。

指定されたデフォルトのEntityContainer名 '[name]'がマッピングおよびメタデータ情報に見つかりませんでした。

簡単な解決策は、App.configを変更して、EFマッピングの各部分(CSDL、SSDL、およびMSL)に正しいリソース名を指定することです。これらの名前が正確にわからない場合は、コンパイルされたアセンブリのリソースを ILSpy または dotPeek で確認してください。

27
ladenedge

EDMXファイルを別のプロジェクトにコピーすると、([プロパティ]ペインの)ビルドアクションがターゲットプロジェクトのデフォルト値の[なし]に戻り、「EntityContainer名...が見つかりませんでした」エラーが発生する可能性があります。 、これはリソースが生成されていないためです。 (この場合、Reflectorでモデルを含むDLLを開くと、リソースはありません。)ビルドアクションを「EntityDeploy」に設定してソリューションを再構築すると、これが修正されます。

4
Michael Bunney

これについてはよくわかりません...少し奇妙に見えるので、これはロングショットです。

ただし、場合によってはObjectContext.MetadataWorkspace.LoadFromAssembly()呼び出しが役立つことがあります。

そして、そうでない場合でも、トレーススタイルの出力を提供する2番目のオーバーロードがあります。

つまり.

Assembly assembly = typeof(AnnouncementText).Assembly;
context.MetadataWorkspace.LoadFromAssembly(
    Assembly, 
    (message) => Console.WriteLine(message)
);
foreach(var at in context.AnnouncementTexts)
   ...

そして、あなたが受け取るメッセージを見てください(もしあれば)。

お役に立てれば

アレックス

2
Alex James

ソリューションエクスプローラーで、エンティティデータモデルファイル(.edmx)を右クリックし、[プログラムから開く]をクリックします。ダイアログボックスが開き、ファイルを開くためのプログラムを選択できます。 「XML(テキスト)エディタ」を選択またはダブルクリックします。

ここで、「EntityContainer」名を簡単に編集できるXMLバージョンのEDMファイルを確認します。

Webconfigファイルの接続文字列を変更した場合は、「DefaultContainerName」がそのXMLファイルの「EntityContainer」セクションの名前であることを確認してください。

通常、*。Designer.csファイルのdefaultContainerNameを更新しても、XMLファイルは更新されません。だからあなたはそれを手動でやらなければなりません。

2
RajivSinghSuwal

さまざまなプロジェクトを統合するときにも同様の問題が発生しました。
問題は、多くのプロジェクトがあったため、複数のedmxがあったことでした。

接続文字列は同じですが、名前空間が異なります。

これを解決するには、使用する接続の1つを選択し、他の接続を変更します。
designer.csとxmlファイルで変更を加える必要があることに注意してください。

1
Marcio Coelho

別のプロジェクトとその中にedmxを作成して、 NopCommerce を拡張しています。 POCOテンプレートは、カスタムObjectContext子孫クラスを生成するために使用されます。

すべてのプロパティ、すべての名前空間を確認しましたが、それでも上記の例外が発生していました。

重要なのは、別のObjectContext子孫クラス(別の名前で別の名前空間内)を生成したMyModel.Designer.csファイルを削除することでした。

1
Kniganapolke

edmxモデルを使用しない場合も同じ問題が発生します。EFpowertoolsベータ2を使用し、エンティティ、コンテキスト、およびビューを生成するリバースエンジニアリングコードの最初の機能を使用します。

また、いくつかのマシンのチームでは、生成されたコンパイル済みビューのハッシュが異なり、TFSチームのビルドでは、他のマシンと同じように、次のような例外が発生するという奇妙な動作があります。質問は、電動工具がコンパイルされたビューのハッシュを生成しているものに基づいていますか?一貫性があることを変更できるのは、devartOracleドライバーを使用するOracleデータベースに対して、EF 4.3.1、system.data.v4.0.30319を備えた電動工具ベータ2を使用していることです。

コンテキスト生成ビュー

// ------------------------------------------------ ------------------------------

//

//このコードはツールによって生成されました。

//ランタイムバージョン:4.0.30319.551

//このファイルを変更すると、誤った動作が発生する可能性があり、コードを再生成すると失われます。

//

// ------------------------------------------------ ------------------------------

[アセンブリ:System.Data.Mapping.EntityViewGenerationAttribute(typeof(Edm_EntityMappingGeneratedViews.ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534))]

名前空間Edm_EntityMappingGeneratedViews

{{

/// <Summary>

/// The type contains views for EntitySets and AssociationSets that were generated at design time.

/// </Summary>

public sealed class ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534 : System.Data.Mapping.EntityViewContainer

{

    /// <Summary>

    /// The constructor stores the views for the extents and also the hash values generated based on the metadata and mapping closure and views.

    /// </Summary>

    public ViewsForBaseEntitySetsC6473E0A11A196A36CC5839589DE2DE553F202E361016A89F2142797168B2534()

    {

        this.EdmEntityContainerName = "Context";

        this.StoreEntityContainerName = "CodeFirstDatabase";

        this.HashOverMappingClosure = "2c6bbce22db7c9c65f8a70c5a1bae1225522a2124aad50e74bdc186ce8c70508";

        this.HashOverAllExtentViews = "26cad9d7334571a0116f89413345d00ec8e031706228df6e653c7b6396c94591";

        this.ViewCount = 56;

    }

例外:

System.Data.EntityCommandCompilationException:System.Data.EntityCommandCompilationException:コマンド定義の準備中にエラーが発生しました。詳細については、内部例外を参照してください。 ---> System.Data.MappingException:EntityContainer'Context 'のマッピングおよびメタデータ情報は、事前に生成されたビューの作成に使用される情報と一致しなくなりました。

1
dumian

ビューSQLを変更した後、同様の問題が発生しました。 ttファイルを右クリックして更新する必要があり、それで修正されました。

0
Rob Sedgwick