0

EF 4.3 Code First を使用して、既存のアプリケーション (純粋な ADO.Net を使用) を新しいアプリケーションに移植しようとしています。私が EF を使用するのはこれが初めてであることに言及する価値があります。

基本的には、サプライヤー テーブルがありますが、2 つのタイプのサプライヤーのそれぞれに固有の属性を持つ 2 つの特殊化テーブルがあります。

既存のデータベースは次のようになります。

create table Supplier(
id_supplier int not null identity
--Bunch of other attributes
);

create table Individual(
id_individual int not null --not identity, gets the same value as the Supplier table
--Attributes specific to individuals
);

alter table Individual add constraint fk_individual_supplier
foreign key(id_individual) references Supplier(id_supplier);

create table Corporation(
id_corporation int not null --not identity, gets the same value as the Supplier table
--Attributes specific to corporations
);

alter table Corporation add constraint fk_corporation_supplier
foreign key(id_corporation) references Supplier(id_supplier);

したがって、表が示すように、サプライヤーは個人または法人のいずれかになります。

既存のアプリケーションは次のようになります。

  • 抽象クラス Supplier とその属性
  • クラス Supplier から派生し、追加の属性を持つ個人
  • 追加の属性を持つ Supplier から派生するクラス Corporation

Ado.Net コードは現在、仕入先オブジェクトを受け取り、渡されたオブジェクトが個人タイプの場合は個人テーブルにレコードを生成し、渡されたオブジェクトが法人タイプの場合は企業テーブルにレコードを生成します。

そのため、サプライヤーのすべてのレコードには、個人または法人のいずれかで一致するレコードがあります。また、個人テーブルと企業テーブルには、データベースの他のテーブルへの外部キーがありません。代わりに、リレーションはすべて Supplier テーブルにあります。ID を生成するテーブルは Supplier です。

これをCode Firstでどのようにマッピングできますか?

最初は、自分の構造、つまり、サプライヤーの抽象クラスと、そこから派生する個人と企業を維持することを考えていました。最初にサプライヤー テーブルに挿入する (ID フィールドを生成する) エンティティが必要なので、個人と企業の両方のモデル クラスがサプライヤー テーブルにマップされるようです。

しかし、抽象クラスを受け取り、タイプに応じて特殊化テーブルのいずれかに挿入するにはどうすればよいでしょうか? 私のアプローチが間違っていると思わせるカスタムSQLなしでは、これは不可能だと思います。

助けてくれてありがとう。

4

1 に答える 1

0

これは、「タイプごとのテーブル」継承 (TPT) のように聞こえます。TPT には、すべての派生型に共通の列を持つベース テーブルと、型固有の列を持つ派生型ごとのテーブルがあります。エンティティ フレームワークは、このモデルをサポートしています。データ注釈と流暢なマッピングの両方を使用してそれを行う方法の例については、この優れたブログ投稿を参照してください。

于 2012-10-16T08:58:52.133 に答える