两种资产超级账本撰写者之间的一对多关系

时间:2018-06-20 11:15:51

标签: hyperledger-fabric hyperledger-composer

我正在测试一个用例,其中使用了两个资产:汽车和零件。我想使用交易将汽车与零件的不同实例关联起来。我的模型和js文件如下:

namespace org.sample.test

asset Part identified by partId {
   o String partId
   o String partName
   o String partManufacturer
}

asset Car identified by Vin {
   o String Vin
   --> Part part optional
   o String modelNumber
}

transaction MakeCar{
   o String carid 
   o String carmodel 
   o String[] PartId
}


/**
 * Sample transaction processor function.
 * @param {org.sample.test.MakeCar} tx The sample transaction instance.
 * @transaction
 */
async function makecar(tx) {  // eslint-disable-line no-unused-vars

   var factory = getFactory();
   var vehicle = factory.newResource('org.sample.test','Car',tx.carid);
   vehicle.modelNumber = tx.carmodel;

   var part = factory.newRelationship('org.sample.test','Part',tx.PartId);
   vehicle.part = part;
   const assetRegistry = await getAssetRegistry('org.sample.test.Car');
   await assetRegistry.add(vehicle);
  // Update the asset in the asset registry.
   }

我还尝试过首先使用getfactory创建资产,然后通过使用数组逐个遍历partIds来创建关系,但是由于我的Car资产尚未创建,但引发了投掷错误。

我更新了交易功能:

async function makecar(tx) {  // eslint-disable-line no-unused-vars

   var factory = getFactory();
   var part;
   var vehicle = factory.newResource('org.sample.test','Car',tx.carid);
   vehicle.modelNumber = tx.carmodel;
   var i=0;
   while (i<tx.PartId.length)
   {
     part = factory.newRelationship('org.sample.test','Part',tx.PartId[i]);
     vehicle.part = part;
     i++;
    }
    assetRegistry = await getAssetRegistry('org.sample.test.Car');
    await assetRegistry.add(vehicle);
  }

现在出现错误:t:实例org.sample.test.Car#OOOO的属性part类型不是org.sample.test.Part []

1 个答案:

答案 0 :(得分:1)

问题是这一行:

var part = factory.newRelationship('org.sample.test','Part',tx.PartId);

应该是[类似]:

 var part = factory.newRelationship('org.example.trading','Part',tx.PartId[0]); // 1st element of an array

它是因为您已将tx.PartId定义为交易定义中的一系列关系,因此您需要访问相关元素。

目前,我不确定您要如何前进,但是您的汽车(车辆)资产与零件(零件ID)具有可选的一对一关系,该关系是模型中的可选字段。也许需要一系列的关系? -> Part[] part optional但替换上面的行,至少会使它以当前形式运行。 SO的答案中显示了使用关系数组的示例:-> Creating new participant and adding array of assets by reference to it(特别是模型中的shares数组)