首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有按类型表继承的实体框架模型

具有按类型表继承的实体框架模型
EN

Stack Overflow用户
提问于 2011-09-07 10:49:59
回答 2查看 761关注 0票数 3

当我用Table-per-Type继承在Entity Framework中定义一个模型时,如果我有一个名为person的基类/表(不是抽象的),以及两个子实体和表,成人和孩子,在创建一个孩子之后,我如何获取相同的对象并将其转换为成人?一旦转换为成人,则应删除子记录,但应保留person表中的基类数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-07 16:53:26

这是不可能的。这是类似here的问题。简单地说,实体是存在的,它的类型是不可变的。唯一的方法是删除子实体(=两个表中的记录)并创建一个新的成人实体(=两个表中的新记录)。

这看起来一点也不像继承的场景。

编辑:

关于继承的注释针对的是您提到的PersonAdultChild实体的场景。无论如何,一旦你的场景允许改变类型,你应该考虑另一种解决方案,可以改变的部分将由组合来处理。

例如:

代码语言:javascript
复制
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并创建新的对象,但原始对象保持不变-只有关系更改。

票数 4
EN

Stack Overflow用户

发布于 2011-09-07 16:39:43

我不会用EF这样做,因为通过继承,您在表关系上创建了一个面向对象的抽象,不允许您从不同的类型进行转换。在OO中,你不能这样做:

代码语言:javascript
复制
Child child = new Child();
Adult grownUp = child;

然后期望孩子长大成人。你可以这样做:

代码语言:javascript
复制
Child child = new Child();
Adult grownUp = child.GrowUp();

因此,假设您使用的是SQL Server,那么您可以使用存储过程来完成此操作。例如GrowUp(子项),并让它在成人表中创建一个新条目,同时删除子表中的条目,但保持Person不变。您可以从过程中返回新的成人对象。然后可以像这样使用:

代码语言:javascript
复制
Adult grownUp = context.GrowUp(child);

但是,您需要在代码中确保在此行之后不再使用子对象,并且可能需要刷新或从上下文中删除它(这一点不完全确定)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7328386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档