breezejs:非标量导航属性是只读的(多对多问题)

时间:2013-10-21 12:25:06

标签: javascript angularjs breeze

我正在使用AngularJS进行数据绑定,除非我使用multi-select类型的控件,否则一切正常。它实际上用新数组替换它,而不是向模型添加或删除元素。然后Breeze提出以下异常:

Nonscalar navigation properties are readonly - entities can be added or removed but the collection may not be changed.

Angular的问题在于,大多数控件(如果不是全部)都使用$ setViewValue(value)函数,该函数将新值作为参数,在本例中为数组。

这里的微风是不是太有限了?有人为此方案有解决方法吗?

我的代码是:

<select ng-multiple="true" multiple  class="multiselect" data-placeholder="Select Contacts"  ng-model="request.contacts" ng-options=" ng-options="c as c.username for c in contacts track by c.id" />

其中contacts是绑定到父控制器的实体的导航属性,myContacts是$ scope上的联系人集合。

修改

我已将代码更改为使用ng-change和中间集合:

<select ng-multiple="true" multiple  class="multiselect" data-placeholder="Select Contacts" ng-change="updateBreezeContacts()"  ng-model="model.selectedContacts" ng-options="c as c.username for c in contacts | filter:{clientId: requestService.selectedRequest.client.id} track by c.id"></select>



$scope.updateBreezeContacts = function () {
  for (var i = 0; i < $scope.model.selectedContacts.length; i++) {
               $scope.requestService.selectedRequest.contacts.push($scope.model.selectedContacts[i]);
 }
}

当我将实体推送到数组时,我仍然会收到上面报告的错误消息。

怎么回事?

编辑2

我明白了。问题是现在breeze尝试将Request实体分配给新添加的Contact。但是Contact实体有一个请求列表,而不仅仅是一个请求。这是一个多对多的关系,breeze不支持(至少使用Entity Framework)。 为了使它工作,我将关联表暴露为一个实体。当用户在多选中选择一个联系人时,我然后创建一个RequestContact实体,然后将该实体推送到Request实体上的RequestContact实体列表中。它远非整洁的代码所以:

我的下一个问题是我正在使用NHibernate,有没有办法让它工作或者很快会得到支持?

1 个答案:

答案 0 :(得分:1)

您正在正确地列出选项,但是您正试图直接将值写入导航属性 - 您无法做到这一点,从来没有能够做到,并且设计应该无法做到。您想要从子项创建一个导航属性到父项,而不是将子项推送到父项的属性中,而它们之间没有键。

为什么不设置一个数组来放置你选择的对象,然后 $ watch 在数组上使用 ngChange 并设置

contact.request = thisRequest;

无论何时添加

contact.request = null;

何时删除?