23

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

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

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

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

   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);

何が間違っている可能性がありますか?

4

8 に答える 8

27

最近、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でコンパイル済みアセンブリのリソースを確認してください。

于 2010-03-02T03:55:04.667 に答える
4

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

于 2011-01-06T00:53:58.277 に答える
2

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

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

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

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

于 2011-04-15T00:10:48.547 に答える
2

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

しかし、ときどき ObjectContext.MetadataWorkspace.LoadFromAssembly() 呼び出しが役立つことがあります。

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

すなわち

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

そして、どんなメッセージが表示されるかを確認してください (もしあれば)。

お役に立てれば

アレックス

于 2010-02-12T00:28:20.570 に答える
1

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

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

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

于 2012-09-28T14:49:39.543 に答える
1

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

また、いくつかのマシンのチームでは、生成されたコンパイル済みビューのハッシュが異なり、TFSチームのビルドでは、他のマシンと同じように、次のような例外が発生するという奇妙な動作があります。質問は、パワーツールがコンパイルされたビューのハッシュを生成しているものに基づいていますか?一貫性があることを変更できるのは、devartoracleドライバーを使用するOracledbに対して、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'のマッピングおよびメタデータ情報は、事前に生成されたビューの作成に使用された情報と一致しなくなりました。

于 2012-07-19T22:09:59.977 に答える
1

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

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

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

于 2011-03-21T09:57:55.107 に答える
0

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

于 2014-08-11T14:00:58.857 に答える