EntityFramework 4.3超类型后期初始化

时间:2012-03-04 18:31:29

标签: entity-framework-4 ef-code-first supertype

我正在使用带有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个单独的表,每个表一个......

1 个答案:

答案 0 :(得分:3)

  

在我创建Person后,如何在没有的情况下将其“推广”给供应商   创建(或重新创建)新的个人记录?

您最不能使用EF,因为您无法更改现有实例的类型(您无法将Person转换为Customer)。因为您无法强制转换实体,所以您也无法使用EF更新数据库中的类型。同时,您无法在现有Customer中插入Id实例,因为此操作需要插入父类型和子类型(请记住Customer在模型中是Person,因为插入客户也意味着插入人员。)

它不起作用的原因是您的域模型错误。您不应该将Customer作为Person的子类型,因为在OOP中它意味着现在发生了什么 - 您无法在不创建新人员实例的情况下将人员更改为客户(因为客户是一个人)。要支持此方案,您必须只有Person实体,并且此实体必须具有描述其类型的属性。