有没有办法让两个子对象使用继承引用相同的基础对象?

时间:2019-01-31 17:27:23

标签: c# asp.net-core entity-framework-6

我想使用现有基础对象的外键将派生对象保存在数据库中。可能吗 我有这样的东西:

public class Base
{
    public int BaseId { get; set; }
}

[Table("ChildA")]
public class ChildA : Base
{
    /*...*/
}

[Table("ChildB")]
public class ChildB : Base
{
    /*...*/
}

我有一个现有的ChildA,并且想要创建一个与ChildA具有相同BaseId的ChildB。问题是EntityFramework不允许我这样做。如果我尝试保存通过现有BaseId的ChildB,则会创建一个新的Base。我了解这是继承的原则,但是我可以实现我所描述的吗?

1 个答案:

答案 0 :(得分:0)

继承意味着“是”关系,而不是“具有”关系,这正是EF在数据库级别建模的确切方式。派生类型将使用其基本类型创建一对一的外键。这样,就不能具有多个衍生项利用相同的基本项目,因为这将违反参照完整性。

简短地说,如果您想“共享”基础项目,那么它根本不应该是基础项目,而应通过组合添加:

public class ChildA
{
    public Base Base { get; set; }
}

public class ChildB
{
    public Base Base { get; set; }
}

很明显,此时您要更改类名,因为它们不再有意义。