1

私たちの組織は、v4 がリリースされたら、Entity Framework での標準化を目指しています。その結果、永続化のために NHibernate を使用するアプリケーションを、POCO サポートを使用して EF4 に移行するには何が必要かを検討しています。いくつかの場所では、単一テーブルの継承 (Table Per Hierarchy とも呼ばれます) を使用しています。以下を使用して動作させることができませんでした。

Payment (基本クラス [抽象的である必要がありますが、そこにも問題があります]) CreditCardPayment (具体的な実装) ACHPayment (具体的な実装) CheckPayment (具体的な実装)

現在、基本クラスのプロパティのみを使用してそれらをマッピングしています。これらのクラスはすべて同じネームスペースにあります。データベースには PaymentTypeId と呼ばれる識別子があるため、Payment マッピングには「When PaymentTypeId = 0」という条件があります。各サブクラスには、異なる値を持つ同じ条件があります (つまり、CreditCardPayment = 1 など)。

DataContext.Payments.ToList() (DataContext は ObjectContext から継承) を使用してすべての支払いのリストをそれぞれ読み込もうとすると、次の例外が発生します。

「ID 'DataLayer.DataModel.CreditCardPayment' のタイプのオブジェクト マッピングが見つかりませんでした。」

POCO CreditCardPayment クラスは POCO Payment クラスと同じ名前空間 (実際には同じファイル) に存在するため、これが何を意味するのかわかりません。

私は何が欠けていますか?

4

2 に答える 2

3

これは、データベース マッピングではなく、モデルから CLR へのマッピングについて不平を言っています。

何らかの理由で EF がCreditCardPaymentクラスを見つけることができません。

考えられる理由の 1 つは、メタデータをまだロードしていないことです。

たとえば、これがある場合:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

次に、クエリを実行すると、EF は CreditCardPayment がどこにあるのかわかりません。

これを回避する方法は、LoadAssembly を使用することです。

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

LoadFromAssemblyクラスによって直接参照されていないすべてのアセンブリに通知する必要がありますDataContext

注: Payments プロパティtypeof(Payment).Assemblyのため、直接参照されます。IQueryable<Payment>

お役に立てれば

アレックス

マイクロソフト。

于 2009-12-07T06:17:56.963 に答える