2012-03-26 19 views
5

私はエンティティデータモデルを作成し、そこからデータベースを生成しました。C#でEntity Frameworkによって生成されたクラスから派生する

エンティティの1つは、Templateと呼ばれます。

Templateの機能を拡張する部分クラスが作成されます。

私は新しいクラスを作成し、Templateから派生しようとすると、私はインスタンス化時に実行時例外を取得:

Mapping and metadata information could not be found for EntityType 'Template001'

どうすれば対処できますか?間違いなく、EFクラスを継承する必要があります。

EDIT

ことができていないようです。その場合、次の要件を実装する最善の方法は何でしょうか。テンプレートエンティティは、それぞれ独自のコードを実行するテンプレートに関する情報を格納します。それが私が最初にエンティティから派生しようとしていた理由です。

+0

[this](http://stackoverflow.com/questions/2350514/ef-mapping-and-metadata-information-could-not-be-found-for-entitytype-error)と[this]( http://stackoverflow.com/questions/2247891/metadata-information-not-found-while-using-ef4s-poco-template)SOの質問。 – Attila

+0

どのような「独自のコード」を念頭に置いているのですか?また、EFは、すべてのデータベースがある場合、context.Template1s.Load()とcontext.Template2s.Load()の違いを理解する必要があります'テンプレート'?あなたはこれをどのように使うつもりの例を挙げることができますか? – hvd

+0

@Attila:ありがとう。最初のリンクは、部分的なクラスで間違いなく使用していたEnumをサポートしていないEFを指していましたが、それを削除しても機能しませんでした。これまでのところ、組成以外の解決策はないようです。何かご意見は? –

答えて

4

なぜエンティティクラスから継承する必要がありますか?単純な振る舞いを追加する場合は、partialクラスを使用します。

更新:コメントに基づいて、時間の経過とともに動作が拡張される可能性があるようです。この場合、継承ではなく、合成/集約を使用することをお勧めします。拡張が必要な​​クラスにフィールドとしてのエンティティがあるようにします。 Raheelのシナリオでは、テンプレート型のフィールド/プロパティを持つTemplateLogicというクラスになります。

+0

このシナリオは説明するのが難しいですが、基本的に各派生クラスは時間の経過とともにコードベースに追加されるカスタム機能を実装します。エンティティ自体は、どのような種類の派生クラスを処理に使用すべきかを単純に格納します。 –

+4

次に、継承ではなく単に合成を使用します。拡張が必要な​​クラスには、フィールドとしてのエンティティがあります。あなたのシナリオでは、Template型のフィールド/プロパティを持つTemplateLogicというクラスがあります。 –

+0

ありがとうございます。これはコードを少し複雑にしますが、間違いなく動作します。私がすぐに相続で答えを見つけなければ、私はこれをやり終えるでしょう。 –

5

サポートされていません。エンティティから新しいタイプを派生させて、永続性のためにマッピングされたエンティティタイプの代わりに使用することはできません。エンティティからクラスを派生させたい場合は、すべての子もデータベースにマッピングされているマップされた継承を使用する必要があります。

+0

派生クラスは永続性に使用されていないため、マップできません。基底のエンティティデータに応じて関数を実装するために作成されます。 –

+0

いいえ、この方法では動作しません。エンティティを派生させてデータベースからデータを取得するか、またはデータをデータベースに保存するために使用する場合は、永続性に使用され、派生クラスもマップする必要があります。マップできない場合は、継承が正しく使用されていないことを意味し、@ Sergeyの提案に従って構図を使用する必要があります。 –

関連する問題