我正在使用带有CodeFirst的EF 4.3,我有一个类似于这个的超类型/子类型:
public Person {
long Id { get; set; }
[Required]
string Name { get; set; }
}
public Costumer : Person {
string SomeData { get; set; }
[Required]
string SomeRequiredData { get; set; }
}
这是问题的简化版本。这些表有几个字段。 一个人可以在应用程序的后期“升级”为Costumer。因此首先创建Person,然后转换为Customer。
问题是:在我创建Person之后如何在不创建(或重新创建)新Person记录的情况下将其“提升”给供应商? 如果我这样做:
var costumer = new Costumer {
Id = [same id used before when Person was created],
SomeRequiredData = "Data"
};
模型提供错误,指出名称是必需的。我不应该要求在新的Vendor实例中重复Person的所有必需信息,因为它已经存在于原始Person记录中。
有人可以帮忙吗?
P.S。该模型配置为创建2个单独的表,每个表一个......
答案 0 :(得分:3)
在我创建Person后,如何在没有的情况下将其“推广”给供应商 创建(或重新创建)新的个人记录?
您最不能使用EF,因为您无法更改现有实例的类型(您无法将Person
转换为Customer
)。因为您无法强制转换实体,所以您也无法使用EF更新数据库中的类型。同时,您无法在现有Customer
中插入Id
实例,因为此操作需要插入父类型和子类型(请记住Customer
在模型中是Person
,因为插入客户也意味着插入人员。)
它不起作用的原因是您的域模型错误。您不应该将Customer
作为Person
的子类型,因为在OOP中它意味着现在发生了什么 - 您无法在不创建新人员实例的情况下将人员更改为客户(因为客户是一个人)。要支持此方案,您必须只有Person
实体,并且此实体必须具有描述其类型的属性。