在微风中添加主/子实体的正确方法?

时间:2013-10-07 22:34:39

标签: breeze

每次我认为我已经钉上钉子了,它再次抬起头来!

所以,如果有一个带有导航属性的主表到一个子集合,我使用“createEntity”创建一个新的实体空版本,我能够看到返回的实体中的导航属性,但我无法访问/设置任何属性。我怀疑这是因为子实体中尚不存在父键?

澄清。我可以在返回新实体的位置放入断点,如果我检查master()实体,我可以在那里看到children属性。如果我然后尝试做:

master().children.childProperty("this is a new value")

...然后我只是得到“对象函数observable()...”(然后从我认为的淘汰代码中加载代码)并结束“没有方法'childProperty'”

我想我已经尝试了人类所知的每个括号组合,但我得到的错误略有不同,但没有任何效果。我需要在某处有一个[0]因为“孩子”实际上是一个数组吗?

添加了相关信息以供澄清。

如下面的评论中所详述,检索在查询中为“预先加载”指定的“展开”的现有实体将返回具有相关子实体的主实体,我可以使用我试图为“新的“上面的例子不起作用。当我返回现有的master / child时,“children”集合的指定长度为1,当我初始化一个新的master / child时,数组长度为零。

我认为这不是传统的主/子关系 - 它更像是一个关联的实体,而不是一个孩子。要解释一下,“主人”将始终有一个儿童记录 - 将其视为主人是瓶子而儿童是确定瓶子颜色,瓶子内容和标签细节的相关记录。只会有一个瓶子,但可能会有几十种颜色,内容和标签。

当我检索现有的主记录时,我还指定了我想要的特定子记录,因此在此页面中,我将只检索一个主记录和一个子记录,因为我正在编辑特定的变体,并且可能想要更改标签文本

在另一个页面中,我列出了瓶子的所有变体,因此我在经典的“一对多”示例中检索一个主人和所有相关的孩子。

模型是:

Public Class bMaster
    Public Property ID() As Integer

    ...other properties

    Public Overridable Property bChildren() As ICollection(Of bChild)
End Class

Public Class bChild
    Public Property ID() As Integer
    Public Property bMasterID() As Integer

    ...other properties

    Public Overridable Property bMaster() As bMaster
End Class

1 个答案:

答案 0 :(得分:4)

卡尔 - 踢自己。你是如此亲密,以至于为你写这个很痛。如果孩子是一个集合,你不能简单地为每个孩子设置一个值。由于它们是一个数组,因此您必须选择其中一个来设置值。

var child = master().children()[0]; // get the first child
child.childProperty(someValue);

这也可以这样工作 -

ko.utils.arrayForEach(master().children(), function (child) {
    child.childProperty(someValue);
});

将遍历您的数组并为集合中的每个实体设置值。

修改

如果是新实体,那么它还没有子实体。如果总是只有一个父实体的子实体,我不知道你为什么使用集合而不是复杂的类型或东西。您需要创建一个父项,然后在该父项上创建一个子项 -

var parentEntity = manager.createEntity('Parent');
var childEntity = manager.createEntity('Child');
childEntity.parent(parentEntity);
return childEntity;

然后,如果您想在父母的孩子身上设置一个属性,那么就像我上面提到的那样 -

var child = master().children()[0]; // get the first child
child.childProperty(someValue);

或者您仍然可以使用

master().children()[0].childProperty(someValue);

最后,如果您正确创建了关系(一对一而不是一对一),您可以使用它 -

master().children().childProperty(someValue);