javascript - Breeze 在客户端设置多个外键

标签 javascript entity-framework breeze single-page-application

我有三个 Breeze 实体,我的应用程序是一个长表单,在前往服务器保存之前一次将记录添加到所有三个表中。其中两个表 Drivers & Vehicles 与 AutoLead 存在关系,并且需要在客户端一次性输入 AutoLead 表中的 AutoLeadId。

所以我有一个表单,用户在 AutoLead 中输入信息,然后以一个无缝表单将记录添加到“驾驶员”和“车辆”表中。如何获取分配给驾驶员和车辆的 ID,而不先将保存的内容分开,然后先保存 AutoLead,返回新的 ID,然后将其分配给驾驶员和车辆,然后再次保存它们。我想避免多次访问服务器只是为了生成车辆和驾驶员导航属性的 ID。

据我了解, Breeze 应该能够使用它创建的客户端临时 ID 来修复这些 ID。但是当我去保存时它并没有改变这些ID。根据:http://www.breezejs.com/documentation/navigation-properties

如果我尝试直接使用对象设置导航属性,则会收到导航属性未定义的错误(请参阅下面的代码)。使用另一种方法,如果我尝试直接在其 ID 上设置外键,我会从 SQL 中收到外键错误,因为它试图将 -1 推送到服务器(临时 ID)。我知道我一定做错了什么。这是我的一些代码:

创建新的客户端实体:

    // New entity creation functions
    var createAutoLead = function() {
        return manager.createEntity('AutoLead');
    };

    var createAutoLeadDriver = function () {
        return manager.createEntity('AutoLeadDriver');
    };

    var createAutoLeadVehicle = function () {
        return manager.createEntity('AutoLeadVehicle');
    };

    // Save Function Loop through all drivers and vehicles and set 
       their autoLeadId's before saving

    var saveAutoLead = function (newAutoLead, autoLeadDrivers, autoLeadVehicles) {

        // Loop through drivers and set the foreign keys
        for (var i = 0; i < autoLeadDrivers().length; i++) {
            autoLeadDrivers()[i].autoLead(newAutoLead);
        }

        // Loop through drivers and set the foreign keys
        for (var i2 = 0; i2 < autoLeadVehicles().length; i2++) {
            autoLeadVehicles()[i2].autoLead(newAutoLead);
        }

        manager.saveChanges()
            .then(saveSucceeded)
            .fail(saveFailed);

        function saveSucceeded() {
            return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),
                    true, config.growlTypes.success);
        }

        return logger.log('Debug Message', 'Quote saved successfully', null, system.getModuleId(datacontext),true, config.growlTypes.success);
    };

最佳答案

我很高兴你明白了。 我只是想指出,设置 FK 也会有效。 在我使用 Northwind 的测试中:

var em = newEm();

// acting as Vehicle
var ord = em.createEntity("Order");
ord.setProperty("orderDate", new Date());

// acting as Driver
var emp2 = em.createEntity("Employee");
emp2.setProperty("firstName", "Test fn2");
emp2.setProperty("lastName", "Test ln2");
emp2.setProperty("fullName", "foo2");

// acting as AutoLead
var emp1 = em.createEntity("Employee");
emp1.setProperty("firstName", "Test fn1");
emp1.setProperty("lastName", "Test ln1");
emp1.setProperty("fullName", "foo1");

我可以将 emp1 与 ord 和 emp2 关联起来,如下所示:

ord.employeeID(emp1.employeeID());
emp2.reportsToEmployeeID(emp1.employeeID());

ord.employee(emp1);
emp2.manager(emp1);

并且在这两种情况下,FK 将在保存后解析/更新。尽管如此,我仍然建议您直接设置导航属性,而不是处理 FK。

关于javascript - Breeze 在客户端设置多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16632315/

相关文章:

javascript - requirejs:从网络服务加载脚本/模块

javascript - jquery添加新的div onclick

javascript - ECMAScript 5 中此属性描述符和属性赋值之间的区别?

mysql - 为什么 EF 为简单查询生成子查询?

c# - 如何使 Entity Framework 映射 DbDataReader?

c# - Entity Framework EDMX 到代码优先

validation - 我的下拉菜单上的 knockout 验证不起作用

knockout.js - 简单的 JSON 和 Breeze 导致错误为 "call fetchMetadata first"

javascript - 使用带有提交按钮和重置按钮的 JavaScript 计算表单中的两个字段

javascript - 如何实现 JavaScript getUserMedia stub 来发送自定义音频字节