我正在使用BreezeJS和Durandal一起工作。这一切都很好,但我有一个关于创建一个与另一个实体有关系的新实体的问题。
假设我们有实体客户和订单。当我创建一个依赖于客户的新订单时,它有2个字段,一个用于customerID,另一个用于客户自己!正确给出了customerID,但由于没有Customer对象而崩溃了!我该如何解决这个问题?
我的Dataservice.createT是:
// This function creates an entity for the specific table (entity)
// that is passed as an parameter. The entity is the same as the table name
//in the map folders. So for creating a new Memo entity should be tblMemo
Dataservice.prototype.createT = function (initialValues, entity) {
return this.manager.createEntity(entity, initialValues);
};
var repairOrderLineN = dataservice.createT({
RepairOrderID: '1', CustomerID: result[0].CustomerId,
Description: result[0].Description, InternalCode: result[0].Code,
Hours: result[0].Hours, Tariff: result[0].Tariff,
Costs: result[0].Costs, Quantity: result[0].Qty,
DamageCode: result[0].Dam, RepairCode: result[0].Rep,
MaterialCode: result[0].Mat, LocationCode: result[0].Location,
IsAgreement: result[0].IsAgreement, IsAuthorized: result[0].IsAuthorized,
DoRepair: result[0].DoRepair
}, 'tblRepairOrderLine');
if (repairOrderLineN.entityAspect.validateEntity()) {
extendItem(repairOrderLineN);
repairorderlines.push(new repairorderline(repairOrderLineN));
dataservice.saveChanges();
updateFinance();
}
从模态给出JSON来创建实体,当然我理解客户对象不在其中!该死的我输了:S帮助:(
答案 0 :(得分:0)
我需要有关您案件的更多信息,特别是“崩溃”的含义。
我不知道你dataservice.createT
做了什么。这实际上有点过于复杂,无法在这里轻松回答。你能为我们简化测试用例吗?
与此同时,这是一个通过测试,我正在添加到DocCode sample的“ entityTests.js ”,它演示了使用Northwind的场景。
/********************************************************* * Add an Order with initializer that set its parent Customer by Id *********************************************************/ test("add Customer created using initializer with parent Customer Id", 4, function () { var em = newEm(); // create a new parent Customer var parentCustomer = em.createEntity("Customer", { CustomerID: breeze.core.getUuid(), CompanyName: 'TestCo' }); // a new Order which is a child of the parent Customer var newOrder = em.createEntity("Order", { CustomerID: parentCustomer.CustomerID() }); ok(newOrder.entityAspect.entityState.isAdded(), "newOrder should be 'added'"); ok(parentCustomer.entityAspect.entityState.isAdded(), "parentCustomer should be 'added'"); var orderCustomer = newOrder.Customer(); ok(orderCustomer, "newOrder's parent 'Customer' property should return a Customer entity"); ok(orderCustomer === parentCustomer, "newOrder's parent Customer should be " + parentCustomer.CompanyName()); });
如果父客户以前存在(例如,已被提取),它也会起作用。
顺便说一下,我必须初始化parentCustomer.CustomerID
,因为它在元数据中定义为客户端生成的密钥。在我们的大多数示例中,实体密钥是存储生成的(例如,Order.OrderID
),并且不会被指定。
我怀疑初始化对象中的某个位置是result[0].something
,其中 something
是一个实体,而不是一个简单的数据值(例如, 。整数id
)。
在我写的时候,如果任何初始化值是Breeze实体,createEntity
会爆炸。这将在v.1.3.2中修复,这应该很快就会出来。请注意,此新功能最初将是测试版。 API不会改变,但有很多边缘条件,很难涵盖它们。需要时间来消除挥之不去的错误。
无论如何,你今天都有其他选择。如果您刚刚使用相关实体的外键ID初始化而不是使用相关实体本身进行初始化,那么您将没有问题。或者您可以在第一次创建实体后分配相关实体,如下所示:
... var thing = manager.createEntity('Thing', { ... initialize with simple data values } var thing.relatedEntityA = relatedEntityA; var thing.relatedEntityB = relatedEntityB; ...