如何使用Breeze.js引用自身实体

时间:2014-11-24 14:36:49

标签: angularjs breeze

我在我的一个项目中使用了breeze.js,我想绘制一个与selft相关的数据图。 元数据的定义是手工完成的。 我的实体引用了两种类型(父类和子类),它们都是实体本身的ID数组。

我的第一次尝试是构建我的客户端metadataStore,如下所示:

function addTransactionCategory() {
        addType({
            name: 'Category',
            dataProperties: {
                id: {type: ID},
                name: {max: 400, nullOk: false},
                description: {max: 400},
                parents: {max: 400}, // This is not correct
                subcats: {max: 400} // This is not correct
            },
            navigationProperties: {
                parents: {type: 'Category', hasMany: true},
                subcats: {type: 'Category', hasMany: true}
            }
        });
    }

以下是JSON数据的示例

{
    _id: 117,
    name: "Utilities",
    description: "Example of entity",
    subcats: [
       118,
       119,
       120,
       121,
       122,
       123,
       124,
       125
    ],
    parents: [ ]
 }

我应该如何在Breeze中实现这种类型的关系,因为他知道navigationProperties正在抛出错误。我的后端是MongoDb,我不想复制这些信息,这就是我使用这种数据模式逻辑的原因。


根据@ward的评论,我想详细说明模型的结构。

从给定的类别中,我希望能够检索附加到此类别的所有父项(级别x - 1),并且我希望能够检索子类别(级别x + 1)。

这是一张左边显示关系示例的图片。 在右边,一个表结构,如果结构将在SQL中设计 example of the entity and SQL tables http://imageshack.com/a/img909/6914/ogeirV.png

此示例显示了一个级别的关系。主要思想是有很多层次的关系。

一个类别可以有0个或n个子类别/父类 子类别可以有0或n个父/子类别 这种结构允许多层次的深层结构 例如。猫A          →猫A A.             →Cat A A A.                →Cat A A A A.                    ...

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

MongoDb不支持实体之间的关系。

Breeze确实如此。但是,我很害怕弥合我害怕的差距。

示例自引用类型

DocCode中的

Employee是自引用EntityType的示例。员工可以拥有一名经理员工(父母)和许多直接下属员工(子女)。

您可以在其中一个Northwind DocCode测试中设置断点,通过Employee提取entityManager.metadataStore.getEntityType('Employee')类型,并检查类型的数据和导航属性,以了解关系的结构。

您会发现Manager FK属性支持每个Employee的ReportsToEmployeeID属性。这符合员工拥有一名经理的想法。 Breeze使用此FK维护缓存中所有员工的ManagerDirectReports属性。

请注意,当员工是“经理”时,它具有“直接报告”导航,但不会维护这些直接报告员工的ID列表。它依赖于能够根据直接报告员工中的FK重建DirectReports数组的内容。

现在将此与您正在做的事情进行比较。

类别有多个父母

分类有多个父母?真?您 确定您的模型是否属实

这意味着父类别和子类别之间存在多对多关系。对不起,但Breeze不支持多对多。您需要中间映射实体来表示Parent_Child连接。在你有机会澄清之前,我会推迟探索这种可能性。

类别父级拥有其子级的ID

Category.subcats属性是一个id数组。这意味着您希望父级保留对子级的引用,而不是让子级保持对父级的引用(EmployeeReportsToEmployeeID作为对经理父级的引用)。

很抱歉,但Breeze没有按照这种方式工作。

了解您希望以这种方式存储数据的原因。 Mongo是非关系型的。要查找类别X的子类别,您认为您不想在Mongo数据库中搜索ParentID X._id的所有类别。

但是现在这些“subcat”ID有什么用呢?您无法直接对它们执行任何操作...除非所有Category实例都在缓存中。

如果您不能指望缓存中的所有类别,则必须使用列出子cat ID的查询来检索“子类”。这有两个问题:(1)查询比“ParentID等于X._id”查询更困难;(2)维护这个subcat数组比维护FK更难。儿童类别。考虑将类别从一个父类别重新分配给另一个父类别时必须执行的操作。这是两次更新操作,他们不能在交易中!

结论

我认为在确定如何在Breeze中设置导航属性之前,首先需要更好地处理模型以及您打算如何在第一时间维护和使用这些关系