我有三个 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/