【发布时间】:2013-12-17 15:59:27
【问题描述】:
我一直在为微风应用中的多对多关联而苦苦挣扎。我在客户端和服务器端都有问题,但现在,我只会公开我的客户端问题。我不知道我想出的方法是否正确,我真的很想得到微风团队的反馈:
我的商业模式:
public class Request
{
public virtual IList<RequestContact> RequestContacts { get; set; }
}
public class RequestContact
{
public virtual Contact Contact { get; set; }
public virtual Guid ContactId { get; set; }
public virtual Request Request { get; set; }
public virtual Guid RequestId { get; set; }
}
public class Contact
{
public virtual Client Client { get; set; }
public virtual Guid? ClientId { get; set; }
public virtual string Username { get; set; }
}
在我的 getRequest 查询的成功回调中,我将 contacts 属性添加到请求并填充它:
request.contacts = [];
request.requestContacts.forEach(function (reqContact) {
request.contacts.push(reqContact.contact);
});
视图绑定到一个联系人数组,在控制器中定义:
<select ng-multiple="true" multiple class="multiselect" data-placeholder="Select Contacts" ng-change="updateBreezeContacts()" ng-model="request.contacts" ng-options="c as c.username for c in contacts | filter:{clientId: request.client.id} track by c.id"></select>
控制器:
//the collection to which the multiselect is bound:
$scope.contacts = dataService.lookups.contacts;
每当在多选中选择或取消选择一个项目时,都会调用此方法:
$scope.updateBreezeContacts = function () {
//wipe out all the RequestContact entities
$scope.request.requestContacts.forEach(function (req) {
req.entityAspect.setDeleted();
});
//populate the RequestContact based on selected contacts
for (var i = 0; i < $scope.request.contacts.length; i++) {
var requestContact = dataService.createRequestContact($scope.request, $scope.request.contacts[i]);
$scope.request.requestContacts.push(requestContact);
}
dataService 的 createRequestContact 方法实际上是这样做的:
manager.createEntity('RequestContact', { request: myRequest, contact: myContact});
用例场景:
- 请求有一个选定的联系人。
- 用户取消选择联系人,然后从列表中选择另一个。
- 然后她决定重新选择之前未选择的那个。我们现在有两个选定的联系人。
- 用户点击保存按钮并调用 saveChanges。 Breeze 向服务器发送 3 个实体:第一个联系人处于“已删除”状态,同一联系人再次处于“已添加”状态,最后另一个被选中的联系人也处于“已添加”状态。
这是在处理多对多关联时应该做的吗?
我实际上得到了一个服务器错误(“非空属性引用了一个空值或瞬态值 Business.Entities.RequestContact.Request”),但在得出任何结论之前,我想知道我在客户端上做了什么-side 是正确的。
【问题讨论】:
-
C#
Request和Contact类的 PK 在哪里(例如,Request.Id和Contact.Id)? -
我在 SO 帖子中省略了它们,但它们在我的代码中。抱歉,我的模型描述不准确。非常感谢这么长的回答,我刚看到它,所以在我回复之前给我一些时间来处理它:)
标签: breeze