Salesforce自定义对象关系创建

Salesforce自定义对象关系创建,salesforce,Salesforce,我想创建两个对象,并使用元数据API通过C#中的父子关系将它们链接起来 我可以通过元数据为对象创建对象和“自定义”字段,但服务只是忽略关系的字段定义 由snipet提供的字段如下所示: CustomField[] fields = new CustomField[] { new CustomField() { type = FieldType.Text, label = "FirstName", length = 50, lengthSpecified =

我想创建两个对象,并使用元数据API通过C#中的父子关系将它们链接起来

我可以通过元数据为对象创建对象和“自定义”字段,但服务只是忽略关系的字段定义

由snipet提供的字段如下所示:

CustomField[] fields = new CustomField[] { new CustomField() 
{ 
  type = FieldType.Text,
  label = "FirstName",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestObject__c.FirstName__c"
},
new CustomField() 
{
  type = FieldType.Text,
  label = "LastName",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestObject__c.Lastname__c"
},
new CustomField() 
{
  type = FieldType.Text,
  label = "Postcode",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestChildObject__c.Postcode__c"
},
new CustomField() 
{
  type = FieldType.MasterDetail,
  relationshipLabel = "PostcodeLookup",
  relationshipName = "LJUTestObject__c.LJUTestObject_Id__c",
  relationshipOrder = 0,
  relationshipOrderSpecified = true,
  fullName = "LJUTestChildObject__c.Lookup__r"
}
};
父对象看起来像:

LJUTestObject
  ID,
  FirstName, Text(50)
  LastName, Text(50)
LJUTestChildObject
  ID,
  Postcode, Text(50)
子对象对象如下所示:

LJUTestObject
  ID,
  FirstName, Text(50)
  LastName, Text(50)
LJUTestChildObject
  ID,
  Postcode, Text(50)
我想将父对象链接到子对象,这样一个“LJUTestObject”就可以有多个“LJUTestChildObjects”


要实现这一点,FieldType、RelationshipName和RelationshipOrder需要哪些值?

我自己并没有通过元数据API创建这些值,但我建议:

relationshipName = "LJUTestObject__c.LJUTestObject_Id__c
应该是:

relationshipName = "LJUTestObject__c.Id

由于Id是标准字段,因此
\uu c
后缀仅用于自定义字段(而不是自定义对象上的标准字段)。此外,可能关系全名应以
\uu c
结尾,而不是
\uu r
,但请先尝试上面的更改,然后再查看您的操作方式。

TL;医生:

将此作为完成所需内容的模板:

var cf = new CustomField();
cf.fullName = "ChildCustomObject__c.ParentCustomField__c";
cf.type = FieldType.MasterDetail;
cf.typeSpecified = true;
cf.label = "Parent Or Whatever You Want This To Be Called In The UI";
cf.referenceTo = "ParentCustomObject__c";
cf.relationshipName = "ParentOrWhateverYouWantThisToBeCalledInternally";
cf.relationshipLabel = "This is an optional label";

var aUpsertResponse = smc.upsertMetadata(metadataSession, null, null, new Metadata[] { cf });
关键区别:

自然的诱惑是将CustomField实例放入CustomObject的
字段
数组中,并将该CustomObject传递给Salesforce元数据API。这确实适用于大多数数据字段,但似乎不适用于关系字段

相反,将CustomField直接传递给Salesforce元数据API,而不是包装在CustomObject中

那些静音错误:

事实证明,错误正在发生,Salesforce元数据API知道这些错误,但对于嵌套在CustomObject中的CustomFields,当这些错误发生时,不会告诉您

通过将CustomField直接传递给元数据API(未包装在CustomObject中),对
upsertMetadata
的调用仍将返回,而不会引发异常(正如它已经为您所做的那样),但这一次,如果出现问题,
upsertResponse[0]。成功
将是false而不是true,和
upsertResponse[0]。错误将提供更多信息

其他问题

  • 必须指定
    referenceTo
    ,如果它与现有内置或自定义对象的名称不匹配,则错误消息将与未指定
    referenceTo
    的错误消息相同

  • fullName
    应以“c not”结尾__r表示关系名称,但请记住,
    fullName
    指定的是字段名称,而不是关系名称

  • relationshipName
    -我通过在末尾不包含_\r,在开头不包含自定义对象名来实现它。我还没有测试过其他方法是否有效,但请注意,至少在
    relationshipName
    中不需要额外的组件

  • 通常请记住,任何名称中带有
    标签的内容都可能是为了在UI中显示给用户,因此其中的空格可以按照用户期望的方式很好地格式化

销售人员。。。真的吗?

(小型警报)

Salesforce元数据API不直观,文档记录也不完整。这就是为什么你在这么简单的事情上被卡住了。这就是为什么没有人知道你问题的答案。这就是为什么,四年后,我被困在同一件事上。创建关系是您希望使用Salesforce元数据API所做的主要事情之一,但长期以来一直很难弄清楚这一点。来吧,Salesforce,我们知道你是一家销售公司,而不是一家技术公司,但是你赚了数不清的钱,并且很乐意炫耀——为那些投资学习你的平台的开发人员多投资一点,为他们提供更好的API体验

SELECT 
    Id,
    OwnerId,
    WhatId,
    Reminder_Date_Time__c, 
    WhoId, 
    Record_Type_Name__c, 
    Task_Type__c,
    Assigned_Date__c, 
    Task_Status__c, 
    ActivityDate, 
    Subject, 
    Attended_By__c,
    Is_Assigned__c 
FROM Task 
WHERE 
    (NOT Task_Status__c LIKE 'Open') AND 
    ActivityDate >= 2017-12-13 AND 
    (NOT Service__r.Service_State__c LIKE 'Karnataka')