2

每次我认为我已经把它钉牢了,它就会再次抬起头来!

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

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

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

...然后我只是得到“object function observable() ...”(然后我认为是来自淘汰赛的大量代码)并结束“没有方法'childProperty'”

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

添加了澄清信息。

正如下面的评论中详述的那样,检索具有在预加载查询中指定的“扩展”的现有实体会返回一个具有相关子实体的主实体,我可以使用我为“新”示例尝试的方法设置其属性以上不起作用。当我返回一个现有的主/子时,“子”集合的指定长度为 1,当我初始化一个新的主/子时,数组长度为零。

我想,这不是传统的主/子关系——它更像是一个关联实体,而不是一个子实体。解释一下,“主人”总是有一个子记录——把它想象成主人是一个瓶子,子是决定瓶子颜色、内容和瓶子上标签细节的相关记录。永远只有一瓶,但颜色、内容和标签可能有几十种变化。

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

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

型号为:

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
4

1 回答 1

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);
于 2013-10-07T22:38:55.527 回答