5

レガシーデータベース上で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私たちのベーステーブルであるカードには、何か助けになるかもしれない場合、ディスクリミネーターフィールドがあります。

4

1 に答える 1

0

既存のデータベースがあるため、最初にコードを使用したくありません。エンティティ データ モデル アイテムをプロジェクトに追加し、提供されたウィザードを使用して既存のデータベースに接続します。

以下はお勧めしませんが、CF モデルを既存のデータベースで動作させる必要がある場合は、次の手順を試してください。

  1. CF に新しいデータベースを生成させます。
  2. EDMMetaData (<EF4.3.1) または __MigrationHistory (>=EF.4.3.1) テーブルを既存のデータベースにコピーします。これにより、 EFは、DB を作成したこと、およびそれが一致することを認識させられます。

: レガシー データベースに対して CF フレームワークを使用すると、エラーが発生する可能性が高くなります。CF フレームワークが完璧でない場合、問題が発生します。

于 2012-07-24T10:25:37.373 に答える