实体如何继承递归模型结构中的属性?

Posted

技术标签:

【中文标题】实体如何继承递归模型结构中的属性?【英文标题】:How can an entity inherit a property in a recursive model structure? 【发布时间】:2018-04-11 10:17:13 【问题描述】:

我在这里有一个与这篇文章相同的结构: How do I create a recursive one-to-many relationship using core data?

看起来像这样:

    cage ---------- animal 1
             |
             |_____ animal 2
             |
             |_____ animal 3 ____ animal 4
                              |
                              |__ animal 5
                                      |
                                      |_____ animal 6

我已经完全按照正确答案实现了我的模型,即

对我来说问题是,在这种结构下,只有animal 1 有一个非零属性cage,但我希望所有后代动物都拥有这个属性cage,这样我就可以查询笼子属性animal6.cage.

我尝试过手动设置,但反向关系会导致任何具有笼子属性的动物成为该笼子的直接孩子,这是我不想要的。

是否可以为每只动物继承笼子属性?

【问题讨论】:

【参考方案1】:

您以对 Core Data 没有意义的方式使用诸如“继承”和“孩子”之类的术语。您拥有与Animal 相关的CageAnimal 与自己有关系。

就核心数据而言,这里没有父/子关系或继承。如果一个Animal 与另一个相关,它们只是具有关系的两个实例。一个不能从另一个继承一个值,因为在 Core Data 使用的任何意义上,一个都不是“父级”。这两个实例是两个独立的对象,它们不会继承任何两个非核心数据对象所继承的任何东西。

因此,设置cage 属性不会使Animal 成为笼子的“直接子代”,它只是说它与笼子有关。如果您想为任意Animal 找到cage,而不在每个实例上设置cage,您需要执行类似(Swift-ish 伪代码)的操作:

func cage(for animal:Animal) -> Cage 
    var currentAnimal = animal
    var cage = currentAnimal.cage
    while cage == nil && currentAnimal.parent != nil 
        currentAnimal = currentAnimal.parent
        cage = currentAnimal.cage
    
    return cage

如果您只想为动物找到笼子,这很好,但您不能在获取请求中使用它。如果您需要在获取时可以使用的东西,您可能需要添加第二个从 AnimalCage 的关系,以便您可以将“父”动物与任何其他动物区分开来。每个Animal 都会有一个关系的值,而另一个关系将保留给父关系。

【讨论】:

我想我可以做一些类似你发布的功能的事情——虽然不知道你最后一段的意思 如果你想做一些事情,比如在一个特定的笼子里取每只动物,不管它们的父母/孩子状态如何,你不能在答案中使用这个方法——你需要一种不同的方法.如果您不需要这样做,那么该功能就是您所需要的。

以上是关于实体如何继承递归模型结构中的属性?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot Jpa实体继承通用属性

java 实体类 注解 继承问题!

实体框架中的类和接口层次结构?

软件构造课程提纲

无法在 ADO .NET 实体模型 edmx 中的类继承中执行覆盖

如何从实体框架中存在数据模型的json中反序列化对象?