レガシーデータベース上でEntityFrameworkCodeFirstDALを作成しています(つまり、ほとんどの場合、設計エラーが発生しても問題が発生します)。
ドメインモデルは(かなり)単純です。HomeCard、CarCard、OwnerCard、RenterCardにサブタイプ化された抽象的なカードがあります。正確には:
abstract class Card {}
class HomeCard: Card {}
class CarCard: Card {}
class OwnerCard: Card {}
class RenterCard: Card {}
データベースモデルは、Cards、Homes、Cars、Owners、Rentersのテーブルでそれに続きます。ここで、Cardsには共通の列が含まれ、他のテーブルには特定のクラスに関連する列が含まれます。これはまさにTPTの意味であり、EntityFrameworkに完全にマッピングされます。
リファクタリング後、(予期せぬことではありませんが)HomeとCarがいくつかのプロパティを共有し、OwnerとRenterが同じことを行うことがわかりました。そして、それは美しさのためだけでなく、いくつかの機能は実装がはるかに簡単です(たとえば、名前で所有者と賃貸人を検索したり、所有者で家とカードを検索したりします)。したがって、ドメインモデルは次のようになります。
abstract class Card {}
abstract class ProperyCard: Card {}
class HomeCard: ProperyCard {}
class CarCard: ProperyCard {}
abstract class PersonCard: Card {}
class OwnerCard: PersonCard {}
class RenterCard: PersonCard {}
ただし、同じdbモデルがまだあります。つまり、TPTとTPCの間に奇妙な組み合わせがあります。EF/CodeFirstを介してマップする試みはすべて失敗しました。それを機能させるためのアドバイスはありますか?
PS私たちのベーステーブルであるカードには、何か助けになるかもしれない場合、ディスクリミネーターフィールドがあります。