2013-09-24 15 views
0

Widgetmaster具有許多widgetVersions。 widgetVersion只能有一個widgetMaster。微風蟲?它試圖添加相關實體,即使在savechanges()中僅指定了主實體()

Public Class widgetMaster 
    Public Property ID() As Integer 

    ...other properties 

    Public Overridable Property WidgetVersions() As ICollection(Of widgetVersion) 
End Class 

Public Class widgetVersion 
    Public Property ID() As Integer 
    Public Property WidgetMasterID() As Integer 

    ...other properties 

    Public Overridable Property WidgetMaster() As widgetMaster 
End Class 

我的視圖模型:

var newWidget = ko.observable(); 
    var newWidgetVersion = ko.observable(); 
    var isSaving = ko.observable(false); 

    var activate = function() { 
     return datacontext.newWidget(newWidget), 
       datacontext.newWidgetVersion(newWidgetVersion).then(setNewWidgetVariables()); 
     } 
    }; 

    var setNewWidgetVariables = function() { 
     newWidget().groupId(globalVar.selectedGroupId()); 
    } 


    var save = function() { 
     isSaving(true); 
     return datacontext.saveChanges([newWidget]).fin(complete); 

     function complete() { 
      isSaving(false); 
     } 
    }; 

即使我的SaveChanges僅指定newWidget實體:

return datacontext.saveChanges([newWidget]).fin(complete); 

...微風在孩子 「widgetVersion」 到widgetVersions仍然在增加表(沒有任何widgetMasterID設置 - 它被設置爲0),我不希望它這樣做!或者至少如果它仍然存在,我希望它拿起新添加的widgetMasterID。

爲什麼微風添加相關的實體,即使我已經告訴它只做主人?我想做主人,獲取新ID,然後保存包含新ID的widgetVersion實體,Breeze因爲某些原因阻止我這樣做,我不明白。

+0

掛上。 (當你需要他的時候,病房在哪裏,呃)我做錯了嗎?我應該通過createEntity('widgetMaster')'創建一個newWidget實體嗎?然後做一些附加的widgetVersion實體嗎?這是否會創建一個鏈接,自動在相關的widgetVersion實體中填寫widgetMaster ID? – TheMook

+0

如果widgetChild是一個添加到widgetParent的新實體,那麼Breeze和您的數據庫不能僅添加父項,它們必須添加數據庫所需的任何子項,以便不拋出任何空引用錯誤。 –

+0

但它沒有添加到父項。無論如何不明確。正如你可以在我的激活方法中看到的,我創建了兩個包含實體的observables。一個包含widgetMaster,另一個包含widgetVersion。問題似乎是,即使我明確地告訴datacontext只保存widgetMaster開始,它也會關閉並創建我在緩存中的widgetVersion。允許Breeze指定要保存的實體,如果它只是忽略該參數,有什麼意義? – TheMook

回答

3

好吧。對不起,我沒有考慮過錯。我的datacontext.savechanges是一個來自模塊的暴露函數,而不是直接調用管理器。此外,暴露的函數並不接受實體參數,所以即使我設置了它,也沒有涉及實際的manager.saveChanges方法。

最重要的是,我將實體設置爲observable,而不是observable的值,所以如果您在幾個月內閱讀本文,請確保在可觀察的kiddies的末尾添加這些括號!

var save = function() { 
     var saveArray = new Array(); 
     saveArray[0] = newWidgetMaster(); 
     isSaving(true); 

     return datacontext.saveChanges(saveArray).fin(complete); 

     function complete() { 
      isSaving(false); 
     } 
    }; 

編輯補充:

只是爲了完整性,並幫助菜鳥像我(現在也是!)這裏的DataContext的AMD模塊的SaveChanges方法(信用約翰爸爸這一點,但接下來的時間包括:實體(至少)作爲你參考的參數!)

var saveChanges = function (entities) { 
     return manager.saveChanges(entities) 
      .then(saveSucceeded) 
      .fail(saveFailed); 

     function saveSucceeded(saveResult) { 
      log('Saved data successfully', saveResult, true); 
     } 

     function saveFailed(error) { 
      var msg = 'Save failed: ' + getErrorMessages(error); 
      logError(msg, error); 
      error.message = msg; 
      throw error; 
     } 
    }; 
+0

感謝您回覆。像這樣的東西確實可以幫助其他人。 :) –

相關問題