2013-09-24 14 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

感谢您回复。像这样的东西确实可以帮助其他人。 :) –

相关问题