2012-07-03 4 views
1

У меня есть следующие модели определены в .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 

ReqeuestId собственности на InfoCard так, что 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") 

Это создает все модели хорошо, и когда я называю refresh на развязку DataSource, данные извлекаются, как и ожидалось.

Проблема проблема Я столкнулся, когда пытаюсь изменить свойство дочернего объекта (e.q. Request.InfoCards(0).Description). Изменение этого значения приведет к изменению в InfoCard, но не в объекте Request. Таким образом, вызов Request.IsUpdated() возвратит ложных, в то время вызова Request.InfoCards(0).IsUpdated() возвратят истинных.

Не удалось узнать, как отслеживать изменения дочерних объектов? Или это проблема с сопоставлениями на стороне клиента? До сих пор я пытался несколько отображений:

  • отображающего все свойства вручную:

    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); 
    }; 
    
  • задающей собственных карты функцию и прохождением ее к итогу:

    window.Request = function (initialData) { 
        var self = this; 
        upshot.observability.configuration.map(initialData, upshot.type(Request), map, self); 
    }; 
    

Отображение кажется правильным со всеми подходами, за исключение того, материнская компания не знает об изменениях, выполненных в своих детях. Возможно ли отслеживание детей?

ответ

4

Хорошо, я нашел проблему в конце. Как оказалось, такое поведение было воспроизводимым, когда существовала иерархия 3 вложенных сущностей (т.е. Request -> InfoCard -> InfoField Изменение значения InfoField не отражает в материнской компании

После.. много часов отладки развязки, я нашел виновник быть _addTrackingRecursive методом upshot.js. Замена obs.track(obj, this._getTracker(), this._entityType); вызова obs.track(obj, this._getTracker(), type); решили вложенное отслеживание изменений проблемы.