Salesforce upsert在INVALID_FIELD错误上失败

时间:2011-01-03 22:03:56

标签: .net soap salesforce webservice-client

我正在使用Salesforce的标准Case对象(我们有一些自定义字段,但这似乎不是问题)。 Case在其Comments中有一个链接子查询,在SOAP API中作为CaseComments进行复制。

用于记录记录的我的测试用例(NUnit测试)是查询()逐个案例编号,更改Case本身的内容,然后重新插入该记录。我甚至没有添加新的评论或任何东西。当upsert调用结束时,我收到一个INVALID_FIELD错误,指出CaseComments在云中的Case表中不存在。当然它不存在,API应该更好。或者也许我不是在说些什么。帮助

相关代码:

[Test]
public void TestUpsertOfExistingRecord()
{
    var existingCase = sfRepository.GetCaseByNumber("00235452");

    var siteState = existingCase.Site_State__c;

    existingCase.Site_State__c = "Arkansas";

    //Tried the below line; the API didn't even recognize my Case as a valid object
    //existingCase.CaseComments = null;

    sfRepository.Save(existingCase);

    ...
}

//In the repository
public void Save<T>(T unboundInfo) where T : sObject
{
    service.Upsert(new sObject[]{unboundInfo});
}

//in a wrapper for the websevice
public void Upsert(sObject[] unboundInfo)
{
    //webService is the actual SOAP service client created by VS
    webService.upsert(unboundInfo.First().Id, unboundInfo);
}

更新:根据一些建议,我不是使用查询生成的Case实例,而是创建一个新的Case。这是失败的权限错误,因为我试图修改的字段是来自另一个相关对象(帐户的地址)的投影,这是可以理解的。我会继续抨击它;在此期间,任何人都可以告诉我为什么创建一个具有相同信息的新案例,在清理所检索的案例的所有相关查询时不会?

2 个答案:

答案 0 :(得分:1)

upsert调用的第一个参数应该是ID字段的 name ,而不是它的值,所以如果你将upsert方法更改为

//in a wrapper for the websevice
public void Upsert(sObject[] unboundInfo)
{
    //webService is the actual SOAP service client created by VS
    webService.upsert("Id", unboundInfo);
}

我认为它应该有效。如果您的案例编号是外部ID(并在salesforce中标记为外部ID),您应该能够使用它而不是“Id”。

有关详细信息,请参阅the salesforce.com upsert docs

答案 1 :(得分:1)

metadaddy的回答是正确的,但我认为指出只有在你需要salesforce来确定是否创建有问题的记录或只更新它们时才应该使用upsert方法。在这种情况下,您已经知道自查询以来记录的ID,因此您可能只是进行更新。

这样,您的操作会稍快一些,因为您需要对salesforce进行查找以查看您的记录是否存在。通过不浪费资源,您可以成为一名优秀的开发者。 :)