实体框架代码优先-每个类型的表继承-插入问题?
|
我在插入继承自基类的子类的实例时遇到问题。
考虑以下来自这些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表中的外键)。
我了解默认情况下需要这样做:显然,如果创建一个子类并将其插入,则需要将其插入两个表中。
我的问题是可以告诉框架-基本表已经有信息-只是插入子表中?
提前致谢!
没有找到相关结果
已邀请:
1 个回复
矾醒忻
的基本部分(如果什么都没有更改,则什么也不做)并插入不可能的派生部分。 想象一下ORM的作用:它将数据库中的关键身份映射到内存中的对象身份。即使在内存中,您也无法实现所需的目标:如果内存中有一个对象为
,则它始终是申请人。您无法神奇地将其“升级”到3英镑。您将必须创建一个类型为“ 3”的新对象,将“ 4”的属性复制到新的“ 3”的基本属性中,然后删除该“ 4”。结果是具有新对象标识的新对象。 我认为您必须在EF中遵循相同的步骤。您的“ 3”将是一个新实体,在“ 4”和“ 3”表中都有新行,您需要删除旧的“ 4”。如果您具有自动生成的密钥,它将是具有新ID的新身份。 (如果您没有自动生成的密钥,则可以在删除旧的
之后再次提供旧的ID,从而“伪造”不变的身份。)如果您引用具有以下内容的旧申请人,这当然会带来很大的潜在麻烦FK约束。 在这种情况下,将申请者“升级”为员工可能不是最佳的继承方法。 “ 4”内部的可选导航属性(从1到0 ... 1的关系)是指另一个包含其他属性的实体,这些属性使申请人成为雇员可以解决此问题。可以设置或不设置此导航属性,从而使您可以区分申请人和也是雇员的申请人。并且,当您将其设为员工时,您无需删除和更改申请人的ID。 (正如所说的“我相信”。也许有一种隐藏的方式,我没有看到。)