我在两个实体之间具有多对多关系。我知道 Dynamics CRM 在数据库中为此创建了一个相交表。我知道如何使用 fetch 命令从自动创建的实体中检索记录。
但现在我想使用 JavaScript 动态地将新记录添加到该表中。这可能吗?
我尝试为此类型创建新记录,但随后出现以下错误。
create 方法不支持 ["relationship_entity_name"] 类型的实体。
JavaScript SDK 在这一点上并不是最清楚的,但基本原理是 SDK 不允许直接插入相交表。它只允许调用
Associate
方法。下面是两个 TechNet 链接,可能会引导您走向正确的方向。
此外,埃维诺在制作 CRM JavaScript 库(已更新以参考 archive.org) 方面做得非常出色,其中包括
Associate
辅助方法。
最后,一些示例代码:
function AssociateEntities(moniker1, moniker2, relationshipName) {
var xml;
var resultXml;
xml = "<Execute xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>";
xml += "<Request xsi:type='AssociateEntitiesRequest'>";
xml += "<Moniker1><Id xmlns='http://schemas.microsoft.com/crm/2006/CoreTypes'>" + moniker1[0].id + "</Id>";
xml += "<Name xmlns='http://schemas.microsoft.com/crm/2006/CoreTypes'>" + moniker1[0].entityType + "</Name></Moniker1>";
xml += "<Moniker2><Id xmlns='http://schemas.microsoft.com/crm/2006/CoreTypes'>" + moniker2[0].id + "</Id>";
xml += "<Name xmlns='http://schemas.microsoft.com/crm/2006/CoreTypes'>" + moniker2[0].entityType + "</Name></Moniker2>";
xml += "<RelationshipName>" + relationshipName + "</RelationshipName>";
xml += "</Request></Execute>";
resultXml = CallCrmService(xml, "Execute");
if (resultXml) {
return "success";
}
else {
return null;
}
}
我最近使用 Xrm.WebApi 做到了这一点。您不能将 createRecord 用于多对多链接实体,这是如何做到的。
async function createAssociation(associationName, primaryEntityName, primaryId, relatedEntities) {
var manyToManyAssociateRequest = {
getMetadata: () => ({
boundParameter: null,
parameterTypes: {},
operationType: 2,
operationName: "Associate"
}),
relationship: associationName,
target: {
entityType: primaryEntityName,
id: primaryId
}}
manyToManyAssociateRequest.relatedEntities = relatedEntities
return await Xrm.WebApi.online.execute(manyToManyAssociateRequest)
}
//driversToAssign is the return array from a standard Dynamics Lookup that contains the id for a driver.
var simpleDriverArray = driversToAssign.map(driver=>{return {entityType: "new_driver", id:driver.id}})
var res = await createAssociation("new_induction_new_driver", "new_induction", inductionId, simpleDriverArray)
console.log(res) //This is a 204 - no content response