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

在breeze中添加主/子实体的正确方法?,breeze,Breeze,每次我以为我把它钉死了,它又抬起头来了 因此,简单地说,如果有一个主表具有子集合的导航属性,并且我使用“createEntity”创建实体的新空版本,我可以在返回的实体中看到导航属性,但我无法访问/设置任何属性。我怀疑这是因为父项在子实体中还不存在 澄清。我可以在返回新实体的点上插入断点,如果我检查master()实体,我可以在那里看到children属性。如果我尝试这样做: master().children.childProperty("this is a new value") …然后我

每次我以为我把它钉死了,它又抬起头来了

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

澄清。我可以在返回新实体的点上插入断点,如果我检查master()实体,我可以在那里看到children属性。如果我尝试这样做:

master().children.childProperty("this is a new value")
…然后我简单地得到“objectfunctionobservable()”(然后我想是从knockout加载代码)并结束“hasnotmethod'childProperty”

我想我已经尝试了人类已知的所有括号组合,我得到了稍微不同的错误,但没有任何效果。因为“children”实际上是一个数组,所以我需要在其中的某个地方有一个[0]吗

添加了澄清信息

如下面的注释中所详细说明的,检索在查询中指定为“expand”的现有实体以进行即时加载将返回一个主实体和一个相关的子实体,我可以使用我尝试为上面的“new”示例设置的方法设置其属性,但该方法不起作用。当我返回现有主/子级时,“children”集合的指定长度为1,当我初始化新的主/子级时,数组长度为零

我想,这不是一种传统的主/子关系——与其说是子关系,不如说是一种关联实体。为了解释,“master”总是有一个子记录——将其视为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

卡尔-踢你自己。你离得太近了,为你写这封信很痛苦。如果子对象是一个集合,那么不能像这样简单地为每个子对象设置一个值。因为它们是数组,所以必须选择其中一个来设置值

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);

卡尔-踢你自己。你离得太近了,为你写这封信很痛苦。如果子对象是一个集合,那么不能像这样简单地为每个子对象设置一个值。因为它们是数组,所以必须选择其中一个来设置值

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);

嗯,遗憾的是没有。我想我曾经试过。我有
var achild=master().childs()[0]
achild=undefined
紧跟其后。如果我将手表添加到对象
master().children
中,它将显示为具有
latestValue:Array[0]
的对象。我正在创建这样的新实体:
masterObservable(manager.createEntity(“master”)
我不需要在该实体上添加“扩展”来获取子实体,是吗?进一步的测试表明,如果我获取一个现有的
主实体
并在查询中指定
扩展(子实体)
,我将(正确地)返回一个主实体和相关子实体。我可以直接设置如下值:
master().children()[0].childProperty('newvalue in here')
。我对新实体的问题似乎是,还没有密钥存在(主id是一个标识字段),以便将主实体和子实体连接在一起。我在原来的帖子中添加了一些澄清。我发布的答案解决了你原来的问题。在一个全新实体上找不到任何子实体的原因是还没有子实体。如果它是一个全新的实体,它在master上有一个id,应该是一个负数,但在你创建或添加之前它不会有任何子实体。不过,这似乎并不完全是事实——或者更可能的是,我误解了我所看到的!新的主实体显然有一个相关子实体的属性(通过外键/导航属性),我可以通过GoogleDevTools中的属性检查器看到这个属性。当然,它显示为长度为零的对象数组。这个我