1

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

所以我有一个表格,用户在 AutoLead 中输入信息,然后以一种无缝的形式将记录添加到 Drivers 和 Vehicles 表中。如何让 Id 分配给 Drivers 和 Vehicles 而不先将保存分开,先保存 AutoLead,返回新的 Id,然后将其分配给 Drivers 和 Vehicles,然后再次保存。我想避免多次访问服务器只是为了生成车辆和驾驶员导航属性的 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);
    };
4

2 回答 2

0

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

   // 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);
    };
于 2013-05-20T03:55:40.447 回答
0

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

于 2013-05-20T21:02:48.963 回答