0

我正在将 BreezeJS 与 Durandal 结合使用。这一切都很好,但我有一个关于创建与另一个实体有关系的新实体的问题。

假设我们有一个实体客户和订单。当我创建一个依赖于客户的新订单时,它有 2 个字段,一个用于 customerID,一个用于 Customer 它自己!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帮助:(

4

1 回答 1

0

我需要有关您的案例的更多信息,特别是您所说的“崩溃”是什么意思。

我不知道你是做什么的dataservice.createT。它实际上有点太复杂,无法在这里轻松回答。你能为我们简化一个测试用例吗?

同时,这是一个通过测试,我添加到DocCode 示例的“ entityTests.js ”中,该示例演示了您使用 Northwind 的场景。

/************************************************* ********
 * 添加一个带有初始化器的订单,通过 Id 设置其父客户
 ****************************************************** *******/
 test("添加使用具有父客户 ID 的初始化程序创建的客户", 4, function () {
     var em = newEm();

     // 创建一个新的父客户
     var parentCustomer = em.createEntity("客户", {
          客户 ID:breeze.core.getUuid(),
          公司名称:'TestCo'
     });

     // 一个新订单,它是父客户的子订单
     var newOrder = em.createEntity("Order", { CustomerID: parentCustomer.CustomerID() });

     ok(newOrder.entityAspect.entityState.isAdded(), "newOrder 应该被'添加'");
     ok(parentCustomer.entityAspect.entityState.isAdded(), "parentCustomer 应该被'添加'");

     var orderCustomer = newOrder.Customer();
     ok(orderCustomer, "newOrder 的父 'Customer' 属性应该返回一个客户实体");
     好的(orderCustomer === parentCustomer,
         "newOrder 的父客户应该是 " + parentCustomer.CompanyName());
 });

如果父客户先前存在(例如,已被获取),它也可以正常工作。

顺便说一句,我必须初始化parentCustomer.CustomerID,因为它在元数据中定义为客户端生成的密钥。在我们的大多数示例中,实体键是存储生成的(例如,Order.OrderID)并且不会被指定。

2013 年 4 月 30 日更新

我怀疑你的初始化对象中的某个result[0].something地方something是一个实体而不是一个简单的数据值(例如,一个整数id)。

在我写的createEntity时候,如果任何初始化器值是 Breeze 实体,就会爆炸。这将在很快发布的 v.1.3.2 中得到修复。请注意,此新功能最初将是测试版。API 不会改变,但是有很多边缘条件,很难涵盖所有这些条件。消除挥之不去的错误需要时间。

无论如何,您今天都有其他选择。如果您只是使用相关实体的外键 ID 进行初始化,而不是使用相关实体本身进行初始化,那么您会很好。或者您可以在第一次创建实体分配相关实体,如下所示:

...
  var thing = manager.createEntity('Thing', {
        ...用简单的数据值初始化
      }

  var thing.relatedEntityA = relatedEntityA;
  var thing.relatedEntityB = relatedEntityB;

...

于 2013-04-27T01:54:52.817 回答