微风虫?即使只在savechanges()中指定了主要实体,它也试图添加相关实体

时间:2013-09-24 14:15:37

标签: entity-framework breeze

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仍在将一个子“widgetVersion”添加到widgetVersions表中(没有设置任何widgetMasterID - 它设置为0)我不希望它这样做!或者至少如果它仍然存在,我希望它能够获取新添加的widgetMasterID。

为什么Breeze添加相关实体,即使我告诉它只做主人?我想做master,获取新的ID,然后保存widgetVersion实体并包含新的ID,Breeze因为某些我无法理解的原因阻止我这样做。

1 个答案:

答案 0 :(得分:3)

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

最重要的是,我将实体设置为observable而不是observable的值,所以如果你在未来几个月内阅读它,请确保在可观察的小子的末尾添加这些括号! / p>

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

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

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

编辑添加:

只是为了完整性并帮助像我一样的noob(仍然是!)这里是datacontext amd模块的savechanges方法(为此向John Papa表示,但下次将实体(至少)包含在你的ratbag的参数中!)

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