实体框架代码优先-每个类型的表继承-插入问题?

| 我在插入继承自基类的子类的实例时遇到问题。 考虑以下来自这些POCO的代码段:
public abstract class EntityBase<T> 
{   
    private T _id;       
    [Key]
    public T ID    
    {       
         // get and set details ommitted.   
    }
}
public abstract class PersonBase<T> : EntityBase<T>
{   
    // Details ommited.  
}

public class Applicant : PersonBase<int>
{   
    // Details ommitted for brevity.  
}

public class Employee : Applicant {}   
现在相当标准的继承。在我们的系统中,当申请人最终成为雇员时,我们会收集额外的数据。如果不雇用他们,他们仍然是申请人,信息有限。 现在考虑建立每个类型表继承模型的流畅API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);                
     // Set up table per type object mapping for the Visitor Hierarchy.       
     modelBuilder.Entity<Employee>().ToTable(\"Employees\");
} 
到目前为止,一切都很好... 如果我查看由此创建的数据库,则有一个名为Applicants的表,其ID列的类型为int,自动递增ID,并且有一个Employees表,其ID字段为主键(非自动递增)。 基本上,雇员表中的ID字段是申请人表的外键。 这就是我要的。我不希望在与申请人表相对应的雇员表中进行记录,直到他们实际成为雇员为止。 当我尝试插入一个属于以下代码的Employee时,问题就来了:
public void PersistCreationOf(T entity)
{     
    DataContextFactory.GetDataContext().Set(typeof(T)).Add(entity);
} 
问题:它插入了一个全新的申请人和雇员。我将其连接到Sql Profiler,并查看了两个插入查询。 我只想插入雇员记录及其已经拥有的ID(Visitors表中的外键)。 我了解默认情况下需要这样做:显然,如果创建一个子类并将其插入,则需要将其插入两个表中。 我的问题是可以告诉框架-基本表已经有信息-只是插入子表中? 提前致谢!     
已邀请:
        除了发送原始SQL命令以将“ 3”减“ 4”属性片段插入“ 5”表之外,我相信这是不可能的。您可以更新或插入实体。基本上,您想要的是更新
Employee
的基本部分(如果什么都没有更改,则什么也不做)并插入不可能的派生部分。 想象一下ORM的作用:它将数据库中的关键身份映射到内存中的对象身份。即使在内存中,您也无法实现所需的目标:如果内存中有一个对象为
Applicant
,则它始终是申请人。您无法神奇地将其“升级”到3英镑。您将必须创建一个类型为“ 3”的新对象,将“ 4”的属性复制到新的“ 3”的基本属性中,然后删除该“ 4”。结果是具有新对象标识的新对象。 我认为您必须在EF中遵循相同的步骤。您的“ 3”将是一个新实体,在“ 4”和“ 3”表中都有新行,您需要删除旧的“ 4”。如果您具有自动生成的密钥,它将是具有新ID的新身份。 (如果您没有自动生成的密钥,则可以在删除旧的
Applicant
之后再次提供旧的ID,从而“伪造”不变的身份。)如果您引用具有以下内容的旧申请人,这当然会带来很大的潜在麻烦FK约束。 在这种情况下,将申请者“升级”为员工可能不是最佳的继承方法。 “ 4”内部的可选导航属性(从1到0 ... 1的关系)是指另一个包含其他属性的实体,这些属性使申请人成为雇员可以解决此问题。可以设置或不设置此导航属性,从而使您可以区分申请人和也是雇员的申请人。并且,当您将其设为员工时,您无需删除和更改申请人的ID。 (正如所说的“我相信”。也许有一种隐藏的方式,我没有看到。)     

要回复问题请先登录注册