0

Widgetmaster 有许多 widgetVersions。一个widgetVersion 只能有一个widgetMaster。

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);

...Breeze 仍在向 widgetVersions 表中添加一个子“widgetVersion”(也没有设置任何 widgetMasterID - 它设置为 0),我不希望它这样做!或者至少如果它仍然存在,我希望它获取新添加的 widgetMasterID。

即使我告诉它只做主,为什么微风会添加相关实体?我想做主,获取新 ID,然后保存包含该新 ID 的 widgetVersion 实体,而 Breeze 出于某种我不明白的原因阻止我这样做。

4

1 回答 1

3

那好吧。对不起,我的错没有考虑清楚。我的 datacontext.savechanges 是模块中的一个公开函数,而不是对管理器的直接调用。此外,公开的函数不接受实体参数,所以即使我正在设置它,它也没有通过实际的 manager.saveChanges 方法。

最重要的是,我将实体设置为可观察对象而不是可观察对象的值,因此,如果您在未来几个月内阅读本文,请确保在可观察孩子的末尾添加这些括号!

    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 方法(为此归功于 John Papa,但下次将实体(至少)作为参数包含在你的老鼠袋中!)

    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;
        }
    };
于 2013-09-24T17:57:51.137 回答