0

我正在嘗試使用Microsoft Dynamics CRM SDK以編程方式更新記錄。 Unfortunatey,我拉紀錄後,更新的領域,並調用.Update()方法對我的服務代理我得到以下異常:System.InvalidCastException:Microsoft Dynamics CRM遇到錯誤

[System.ServiceModel.FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>] 
System.InvalidCastException: Microsoft Dynamics CRM has experienced an error. 
Reference number for administrators or support: #B08B34D9" 
System.ServiceModel.FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> 

因爲我以前從未使用過CRM,我們有稀缺資源,目前在公司內部使用它,我不知道如何/從哪裏開始調查異常,或者從哪裏可以找到它。

該程序以下列方法開始。這只是查詢數據的匹配EIN號碼。如果沒有記錄,那麼我使用.Create()方法。如果找到記錄,我們會更新Dynamics中當前存在的項目。

public string UpdateDynamics(AgentTransmission agt) 
    { 
     ConditionExpression condition = new ConditionExpression(); 
     condition.AttributeName = "neu_taxid"; 
     condition.Operator = ConditionOperator.Equal; 
     condition.Values.Add("012-3456787"); 

     ColumnSet columns = new ColumnSet(true); 

     QueryExpression query = new QueryExpression(); 
     query.ColumnSet = columns; 
     query.EntityName = "account"; 
     query.Criteria.AddCondition(condition); 

     OrganizationServiceClient client = new OrganizationServiceClient(); 
     EntityCollection collection = client.RetrieveMultiple(query); 

     if (collection.Entities.Count == 0) 
     { 
      _servicePoxy.Create(CreateAccount(agt)); 
     } 
     else 
     { 
      foreach (Entity contact in collection.Entities) 
      { 
       //This throws the exception 
       _servicePoxy.Update(CreateAccount(agt, contact.Id)); 
      } 
     } 

     return string.Empty; 
    } 

下面是我用它來創建Entity對象,我們傳遞給動力學的方法。數據從實體框架模型對象中提取並映射到相應的字段。

private Entity CreateAccount(AgentTransmission agt, Guid Id = new Guid()) 
    { 
     _account = new Entity(); 
     _account.LogicalName = "account"; 
     _account.Attributes.Add("name", agt.AgencyName); 
     _account.Attributes.Add("telephone1", agt.BusinessPhone.Replace("(","").Replace(")", "").Replace("-", "")); 
     _account.Attributes.Add("address1_line1", agt.MailingStreet1); 
     _account.Attributes.Add("address1_city", agt.MailingCity); 
     _account.Attributes.Add("address1_postalcode", agt.MailingZip); 
     _account.Attributes.Add("neu_address1stateprovince", LookupStateCode(agt.MailingState)); 
     _account.Attributes.Add("address1_addresstypecode", new OptionSetValue(1)); //1 for Mailing 
     _account.Attributes.Add("neu_channelid", LookupChannelId(agt.Channel)); 
     _account.Attributes.Add("neu_appointmentstatus", new OptionSetValue(279660000)); 
     _account.Attributes.Add("customertypecode", LookupCustomerCode(agt.RelationshipType)); 
     _account.Attributes.Add("neu_taxid", UnobfuscateRef(agt.ReferenceNumber).ToString()); 

     //If we're doing an update will need the GUID. Only use when Update is needed. 
     if (Id != Guid.Empty) 
     { 
      _account.Attributes.Add("accountid", Id); 
     } 

     return _account; 
    } 

.Create()方法的工作,因爲它是應該,但是,所以我認爲異常被隔離於accountid GUID屬性我使用的更新。

+0

有一點需要注意的是,您明​​顯從別處複製了一些代碼,因爲您檢索了帳戶記錄,但是您的foreach將其稱爲「contact」foreach(實體在collection.Entities中的聯繫人)''。雖然這會起作用,但它可能暗示您複製了其他部分,並導致您遇到的問題。我懷疑你的一個Lookup *輔助函數返回一個不匹配的數據類型。 – Filburt 2014-10-07 22:32:24

+2

InvalidCastException是一個很大的提示,一個或多個屬性設置爲錯誤的類型 – 2014-10-08 04:09:54

+0

雖然它可能是一個很好的提示...沒有關於什麼屬性設置不正確的上下文,但它實際上是無用的(並且非常令人沮喪)的消息。 – 2016-02-23 04:18:50

回答

0

在你CreateAccount方法,當你正在處理現有的實體,嘗試改變這一行:

_account.Attributes.Add("accountid", Id); 

_account.Id = Id; 

從理論上講,它不應該的問題,但實體實例的Id財產應該始終爲現有記錄設置。

您可能還需要考慮將作爲參數的賬戶實體(您在for循環中調用聯繫人)而不是id轉換爲CreateAccount作爲參數,然後您不必在每次調用中顯式創建賬戶實例也可以刪除試圖分配id的邏輯(因爲傳入的實體已經定義了它)。

例如,你的電話是:

_servicePoxy.Create(CreateAccount(agt), new Entity("account")); 

_servicePoxy.Update(CreateAccount(agt, contact)); 

然後你可以從CreateAccount刪除這些行:

_account = new Entity(); 
_account.LogicalName = "account"; 

if (Id != Guid.Empty) 
{ 
    _account.Attributes.Add("accountid", Id); 
} 

(我會發布這更多評論,但我沒有足夠的權限)。

0

System.ServiceModel.FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>吃堆棧跟蹤。參考this blog作爲實際記錄堆棧跟蹤的方法,以便能夠找到發生錯誤的位置。