不想堵塞这个问题,我已经遗漏了大部分代码,但如果它有帮助我可以把它放进去。
使用Breeze 1.4.9和Breeze.angular v.0.9.0
我有一个简单的模型:ChartDefinition
只有一个DataQuery
,DataQuery
有一些参数。
我有一个轻微的查询:
var query = breeze.EntityQuery
.from("ChartDefinitions")
.expand(["DataQuery","DataQuery.Parameters"]);
//.noTracking();
我可以看到服务器的响应(我用' ...'替换了大多数简单属性):
[{"$id":"1","$type":"itaprm4.Domain.ChartDefinition, itaprm4","Id":1,"Title":"FirstChart", ... ,
"DataQuery":
{"$id":"2","$type":"itaprm4.Domain.DataQuery, itaprm4","Id":1, ... ,
"Parameters":
[{"$id":"3","$type":"itaprm4.Domain.DataQueryParameter, itaprm4","Id":1, ...}]
}
}
,{"$id":"4","$type":"itaprm4.Domain.ChartDefinition, itaprm4","Id":2,"Title":"ProjectBudgets", ... ,
"DataQuery":
{"$id":"5","$type":"itaprm4.Domain.DataQuery, itaprm4","Id":2, ... ,
"Parameters":[]
}
},
{"$id":"6","$type":"itaprm4.Domain.ChartDefinition, itaprm4","Id":3,"Title":"ProjectActuals", ... ,
"DataQuery":
{"$id":"7","$type":"itaprm4.Domain.DataQuery, itaprm4","Id":3, ... ,
"Parameters":
[{"$id":"8","$type":"itaprm4.Domain.DataQueryParameter, itaprm4","Id":2,"DataQueryId":3, ...},
{"$id":"9","$type":"itaprm4.Domain.DataQueryParameter, itaprm4","Id":3,"DataQueryId":3, ...}
]
}
}]
实体实现后,最后DataQuery
个对象($ id:7)的参数数组但是,它只包含最后一个参数($ id:9)
在breeze.debug
中挖掘我看到noTracking
导致物化代码向下移动到不同的路径,因此将noTracking()
选项添加到查询中。这导致两个出现在materlised Parameters
数组中的参数。 (我假设,因为breeze 可以正确地实现对象图,服务器上的代码没有任何问题?所以我还没有将它包括在内问题...)
我只是保持noTracking
选项,但是,我在微风中注册构造函数,如果noTracking
处于启用状态,则不会调用它。
store.registerEntityTypeCtor('ChartDefinition', ChartDefinition);
在没有noTracking
选项的情况下,我需要做些什么来填充参数数组吗?
编辑:
另一个观察结果:如果没有noTracking
选项,带有$ id:8的DataQueryParameter
实际上会以$ {5}的DataQuery
的参数数组结束。
答案 0 :(得分:1)
原来这与服务器上的内容有很大关系!
我们的nHibernate设置为DataQueryId
类的DataQuery
属性使用了不同的名称(团队中的开发人员告诉我更新实体存在一些问题并且这样做解决了这个问题):
<class name="DataQuery" table="sys_DataQuery" dynamic-update="true" >
<id name="Id" column="DataQueryId" type="int" unsaved-value="0">
<generator class="identity" />
</id>
...
<bag name="Parameters" cascade="all-delete-orphan">
<key column="DataQueryId"/>
<one-to-many class="DataQueryParameter"/>
</bag>
</class>
<class name="DataQueryParameter" table="sys_DataQueryParameter" dynamic-update="true" >
...
<property name="DataQueryId" type="int" not-null="true" insert="true" update="true" />
...
</class>
在类定义中使用匹配标识符。
将Id
更改为DataQueryId
解决了我的问题:
<class name="DataQuery" table="sys_DataQuery" dynamic-update="true" >
<id name="DataQueryId" column="DataQueryId" type="int" unsaved-value="0">
<generator class="identity" />
</id>
...
这似乎有道理;怎么会轻易知道匹配DataQueryParamter.DataQueryId
到DataQuery.Id
但是,我不知道为什么Breeze可以正确实现对象图,但是打开了noTracking?