没有noTracking的Breeze一对多导航属性没有完全实现

时间:2014-08-20 11:20:33

标签: angularjs breeze

不想堵塞这个问题,我已经遗漏了大部分代码,但如果它有帮助我可以把它放进去。

使用Breeze 1.4.9和Breeze.angular v.0.9.0

我有一个简单的模型:ChartDefinition只有一个DataQueryDataQuery有一些参数。

我有一个轻微的查询:

    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的参数数组结束。

1 个答案:

答案 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.DataQueryIdDataQuery.Id但是,我不知道为什么Breeze可以正确实现对象图,但是打开了noTracking?