【问题标题】:Breeze Setting Multiple Foreign Keys On The Client-sideBreeze 在客户端设置多个外键
【发布时间】:2013-05-21 05:02:48
【问题描述】:

我有三个轻而易举的实体,我的应用程序是一个长表单,它在去服务器进行保存之前一次将记录添加到所有三个表中。 Drivers 和 Vehicles 表中的两个表与 AutoLead 有关系,需要 AutoLead 表中的 AutoLeadId,该表在客户端一次性输入。

所以我有一个表单,用户在 AutoLead 中输入信息,然后以一种无缝的形式将记录添加到 Drivers 和 Vehicles 表中。如何让 Id 分配给 Drivers 和 Vehicles 而不首先将保存分开,并首先保存 AutoLead,返回新的 Id,然后将其分配给 Drivers 和 Vehicles,然后再次保存它们。我想避免多次访问服务器只是为了为 Vehicles 和 Drivers 上的导航属性生成 Id。

据我了解,微风应该能够使用它创建的客户端的临时 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);
    };

【问题讨论】:

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


    【解决方案1】:

    我很高兴你明白了。 我只是想指出,设置 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。

    【讨论】:

    • 感谢您的回答。有时我会在函数()的末尾添加对象时感到困惑。例如,在我上面的循环中,出于某种原因,我不得不调用 autoLeadDrivers()[i]().autoLead(newAutoLead());和其他 autoLeadVehicles()[i].autoLead(newAutoLead());一个没有 () 另一个有,否则会出错,即使它们都是可观察的。
    【解决方案2】:

    能够弄清楚。对于遇到此问题的任何人,您必须直接设置导航属性,不要自己设置外键。修复是将导航属性作为一个函数推送,所以下面是修复的代码。因为微风实体被包裹在一个可观察对象中,所以我必须将它添加为一个函数,并在末尾添加 ()。

       // Save auto lead
        var saveAutoLead = function (newAutoLead, autoLeadDrivers, autoLeadVehicles, newAutoLeadDriver, newAutoLeadVehicle) {
    
            // Detach orphan entities
            manager.detachEntity(newAutoLeadDriver());
            manager.detachEntity(newAutoLeadVehicle());
    
            // 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 i = 0; i < autoLeadVehicles().length; i++) {
                autoLeadVehicles()[i].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);
        };
    

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2014-02-23
      • 1970-01-01
      • 2013-01-22
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      相关资源
      最近更新 更多