在Breeze中依赖其他实体创建实体

时间:2013-04-24 07:27:12

标签: javascript breeze durandal

我正在使用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帮助:(

1 个答案:

答案 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),并且不会被指定。

2013年4月30日更新

我怀疑初始化对象中的某个位置是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;

...