Entity framework 4 EntityFramework 4.3超类型延迟初始化

Entity framework 4 EntityFramework 4.3超类型延迟初始化,entity-framework-4,ef-code-first,supertype,Entity Framework 4,Ef Code First,Supertype,我将EF 4.3与CodeFirst一起使用,我有一个类似于此的超类型/子类型模型: public Person { long Id { get; set; } [Required] string Name { get; set; } } public Costumer : Person { string SomeData { get; set; } [Required] string SomeRequiredData { get; set; }

我将EF 4.3与CodeFirst一起使用,我有一个类似于此的超类型/子类型模型:

public Person {
    long Id { get; set; }
    [Required]
    string Name { get; set; }
}
public Costumer : Person {
    string SomeData { get; set; }
    [Required]
    string SomeRequiredData { get; set; }
}
这是问题的简化版本。这些表有几个字段。 在以后的应用程序中,一个人可以被“提升”为客户。所以,人首先被创造出来,然后转化为客户

问题是:在我创建Person之后,我如何在不创建(或重新创建)新的Person记录的情况下将其“升级”到供应商? 如果我这样做:

模型给出了一个错误,指出名称是必需的。我不需要在新供应商实例中重复Person提供的所有必需信息,因为它已经存在于原始Person记录中

有人能帮忙吗

另外,该模型配置为创建两个单独的表,每个类一个

在我创建了Person之后,我如何才能在没有 创建(或重新创建)新的个人记录

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


它不起作用的原因是您的域模型是错误的。您不应该将
Customer
作为
Person
的子类型,因为在OOP中,它正好意味着现在发生的事情-您不能在不创建新Person实例的情况下更改Person-to-Customer(因为Customer是Person)。要支持此场景,您必须只有
Person
实体,并且此实体必须具有描述其类型的属性。

感谢Ladislav,这确实是一个将OO建模为DB实体的问题。虽然我有两个表,并且可以在数据库中的不同时刻创建两个实体,但OO模型是不允许的。我已经改变了我的OO模型,在两个实体之间建立了一对一的关系,并解决了这个问题。再次感谢您的提醒。
var costumer = new Costumer { 
    Id = [same id used before when Person was created], 
    SomeRequiredData = "Data"  
};