0

我正在尝试使用 EF 4.3 Code First 将现有应用程序(使用纯 ADO.Net)移植到新应用程序。值得一提的是,这是我第一次使用 EF。

基本上我有一个供应商表,但有两个专业化表,其属性特定于两种类型的供应商。

这是现有数据库的样子:

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);

因此,如表格所示,供应商可以是个人或公司。

现有的应用程序是这样的:

  • 抽象类供应商及其属性
  • 类从供应商派生的个体及其附加属性
  • 类 Corporation 派生自 Supplier 及其附加属性

Ado.Net 代码当前用于接收供应商对象,如果传递的对象是个人类型,则在个人表上生成记录,如果传递的对象是公司类型,则在公司表上生成记录。

因此,供应商上的每条记录都将在个人或公司上具有匹配的记录。此外,个人和公司表没有任何其他数据库表的外键。相反,关系都与供应商表。生成 ID 的表是供应商。

如何使用 Code First 进行映射?

起初我考虑保留我的结构,我的意思是,Supplier 抽象类以及由此派生的个人和公司。因为我需要实体首先在供应商表上插入(生成标识字段),所以个人和公司模型类似乎都将映射到供应商表。

但是它怎么可能接收抽象类并根据类型插入到任一专业化表中呢?如果没有自定义 SQL,我认为这是不可能的,这让我认为我的方法是错误的。

提前感谢您的帮助。

4

1 回答 1

0

这听起来像“每个类型的表”继承(TPT)。使用 TPT 有一个基表,其中的列对于所有派生类型都是通用的,并且每个派生类型的表都具有特定于类型的列。实体框架支持此模型。有关如何使用数据注释和流畅映射的示例,请参阅这篇出色的博客文章。

于 2012-10-16T08:58:52.133 回答