我在.NET中定义了以下模型:
Public Class Request
<Key()>
Public Property RequestId As String
Public Property Description As String
Public Property InfoCards As List(Of InfoCard)
End Class
Public Class InfoCard
<Key()>
Public Property InfocardId As String
Public Property Description As String
Public Property RequestId As String
End Class
InfoCard上的 ReqeuestId 属性使EF Code First可以生成数据库。
然后我使用UpshotContext
帮助器生成JavaScript模型,如下所示:
Html.UpshotContext(bufferChanges:= true) _
.DataSource(Of UpshotTest.UpshotTest.RequestController)(Function(x) x.GetRequests()) _
.ClientMapping(Of UpshotTest.Models.Request)("Request") _
.ClientMapping(Of UpshotTest.Models.InfoCard)("InfoCard")
这很好地生成了所有模型,当我在upshot dataSource上调用refresh
时,将按预期检索数据。
我面临的问题是我尝试修改子对象的属性(e.q。Request.InfoCards(0).Description
)。更改该值将触发InfoCard
中的更改,但不会触发Request
实体中的更改。因此,调用Request.IsUpdated()
将返回 false ,而调用Request.InfoCards(0).IsUpdated()
将返回 true
upshot不知道如何跟踪子实体的变化吗?或者是客户端映射的问题? 到目前为止,我已经尝试了几个映射:
手动映射所有属性:
window.Request = function (initialData) {
var self = this;
self.RequestId = ko.observable(initialData.RequestId);
self.Description = ko.observable(initialData.Description);
self.InfoCards = ko.observableArray(ko.utils.arrayMap(initialData.InfoCards, function (data) {
return new window.InfoCard(data);
}));
upshot.addEntityProperties(self, "Request:#UpshotTest.Models");
};
使用upshot.map
:
window.Request = function (initialData) {
var self = this;
upshot.map(initialData, upshot.type(Request), self);
};
定义我自己的 map 函数并将其传递给upshot:
window.Request = function (initialData) {
var self = this;
upshot.observability.configuration.map(initialData, upshot.type(Request), map, self);
};
对于所有方法,映射似乎都是正确的,除了父实体不知道在其子代中进行的修改。儿童追踪甚至可能吗?
答案 0 :(得分:4)
好的,我最终找到了这个问题。事实证明,当存在3个嵌套实体的层次结构时,这种行为是可重现的(即请求 - > InfoCard - > InfoField 。修改 InfoField 的值不反映在父实体中。
经过数小时的调试后,我发现罪魁祸首是 upshot.js 中的_addTrackingRecursive
方法。将obs.track(obj, this._getTracker(), this._entityType);
调用替换为obs.track(obj, this._getTracker(), type);
解决了嵌套的更改跟踪问题。