当我在Entity Framework中使用Table-per-Type继承定义模型时,如果我有一个名为person的基类/表(非抽象),以及两个子实体和表adult和child,在创建了一个child之后,我如何将同一对象转换为adult? 一旦转换为adult,应删除child记录,但person表中的基类数据应保留。
public class DataSource
{
public int Id { get; set; }
public virtual DataSourceFeatures Features { get; set; }
}
public class DataSourceFeatures
{
[Key, ForeignKey("DataSource")]
public int Id { get; set; }
public virtual DataSource DataSource { get; set; }
}
public class XmlDataSourceFeatures : DataSourceFeatures { ... }
public class DelimitedDataSourceFeatures : DataSourceFeatures { ... }
public class ServiceDataSourceFeatures : DataSourceFeatures { ... }
DataSourceFeatures
,并创建一个新的,但原始对象保持不变 - 只有关系改变。我不会在EF中这样做,因为使用继承后,您已经创建了一个面向对象的抽象层来处理表关系,这不允许您从不同类型进行转换。在面向对象编程中,您无法像这样实现:
Child child = new Child();
Adult grownUp = child;
Child child = new Child();
Adult grownUp = child.GrowUp();
假设您正在使用SQL Server,您可以使用存储过程来实现这一功能。例如,创建一个名为GrowUp(child)的存储过程,在其中创建Adult表中的一个新条目,同时删除Child表中的该条目,但不影响Person表。您可以从存储过程返回新成年人对象。然后可以按如下方式使用:
Adult grownUp = context.GrowUp(child);
然而,在你的代码中,你需要确保在这一行之后不再使用子对象,并且很可能需要刷新或从上下文中删除它(对此并不完全确定)。