Entity Framework 4 の POCO エンティティを使用した階層ごとのテーブルの継承
-
13-09-2019 - |
質問
私たちの組織は、v4 がリリースされたら Entity Framework を標準化することを検討しています。その結果、永続化に NHibernate を使用するアプリケーションを、POCO サポートを使用して EF4 に移行するには何が必要かを検討しています。いくつかの場所で、単一テーブルの継承 (階層ごとのテーブルとも呼ばれます) を使用します。以下を使用して動作させることができませんでした。
支払い(基本クラス[抽象的ですが、そこにも問題があるはずです])クレジットカードペイメント(具体的な実装)ACHPAYMENT(コンクリートの実装)チェックペイメント(具体的な実装)
現時点では、基本クラスのプロパティのみを使用してマッピングしています。これらのクラスはすべて同じ名前空間内にあります。データベースには PaymentTypeId と呼ばれる識別子があるため、Payment マッピングには「When PaymentTypeId = 0」という条件があります。各サブクラスには、異なる値を持つ同じ条件があります (つまり、CreditCardPayment = 1 など)。
DataContext.Payments.ToList() (DataContext は ObjectContext から継承) を使用してすべての支払いのリストをそれぞれロードしようとすると、次の例外が発生します。
「ID 'DataLayer.DataModel.CreditCardPayment' のタイプのオブジェクト マッピングが見つかりませんでした。」
POCO CreditCardPayment クラスは POCO Payment クラスと同じ名前空間 (実際には同じファイル内) に存在するため、これが何を意味するのかわかりません。
私には何が欠けているのでしょうか?
解決 2
これまで表現していなかったもの(関連性があるとは思わなかったが、関連性はあった)。CreditCardPayment は「CreditPayment」という名前の中間クラスから継承され、ACHPayment は CashPayment から継承されました。CreditCardPayment と CashPayment は同じ名前空間とファイル内に存在しますが、EF マッピングでは表現されませんでした。これらをマッピング ファイル内に追加すると、すべてが正常に機能しました。
したがって、EF はこれらの型のいずれかに直接マップされることはないと考えられますが、CreditCardPayment クラスなどのベースタイプを変更するため、EF はそれらの型について知る必要があるようです。ご協力いただきありがとうございます。
他のヒント
これはデータベース マッピングに関するものではなく、モデルから 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
クラス。
注記: typeof(Payment).Assembly
直接参照されるのは、 IQueryable<Payment>
支払いプロパティ。
お役に立てれば
アレックス
マイクロソフト。