EntityState必须设置为null,Created(用于创建消息)或Changed(用于更新消息)

时间:2017-07-19 10:52:50

标签: c# linq dynamics-crm-2016

在我的C#控制台应用程序中,我正在尝试更新CRM 2016中的帐户。IsFaulted不断返回true。 向下钻取时返回的错误消息如下:

  

必须将EntityState设置为null,Created(对于Create消息)或Changed(对于Update消息)。

如果它可能导致错误,我已经在底部粘贴了我的LINQ查询。

我从谷歌那里得到的答案表明我正在混合ServiceContextProxyService(我没有在这种情况下使用它)。其他人说我错误地使用context.UpdateObject(object),我也没有使用它。

更新:有人刚刚通知我上述错误是由于我试图返回所有元数据而不仅仅是更新的数据。我仍然不知道如何修复错误,但这些信息应该会有所帮助。

private static void HandleUpdate(IOrganizationService crmService, List<Entity> updateEntities)
{
    Console.WriteLine("Updating Entities: " + updateEntities.Count);

    if (updateEntities.Count > 0)
    {
        try
        {
            var multipleRequest = new ExecuteMultipleRequest()
            {
                // Assign settings that define execution behavior: continue on error, return responses. 
                Settings = new ExecuteMultipleSettings()
                {
                    ContinueOnError = true,
                    ReturnResponses = true
                 },
                 // Create an empty organization request collection.
                 Requests = new OrganizationRequestCollection()
            };

            foreach (var account in updateEntities)
            {
                multipleRequest.Requests.Add(
                    new UpdateRequest()
                    {
                        Target = account
                    });
            }

            ExecuteMultipleResponse response = (ExecuteMultipleResponse)crmService.Execute(multipleRequest);

            if (response.IsFaulted)
            {
                int failedToUpdateAccount = 0;
                foreach (ExecuteMultipleResponseItem singleResp in response.Responses)
                {
                    if (singleResp.Fault != null)
                    {
                        string faultMessage = singleResp.Fault.Message;
                        var account = ((UpdateRequest)multipleRequest.Requests[singleResp.RequestIndex]).Target;

                        Log.Error($"Error update acc.id: {account.Id}.Error: {singleResp.Fault.Message}.");
                        failedToUpdateAccount++;
                    }
                }
                Log.Debug($"Failed to update {failedToUpdateAccount} accounts.");
            }
            else
            {
                Log.Debug("Execute multiple executed without errors");
            }
        }
        catch (Exception ex)
        {
            Log.Error($"Error while executing Multiplerequest", ex);
        }
    }
}

// LINQ以下

private static List<Account> GetAllActiveCRMAccounts(CRM2011DataContext CRMcontext)
{

    Console.WriteLine("Start Getting CRMExistingAccounts ....");
    List<Account> CRMExisterendeAccounts = new List<Account>();

    try
    {
        CRMExisterendeAccounts = (from a in CRMcontext.AccountSet
                                  where a.StateCode == AccountState.Active
                                  where a.anotherVariable == 1
                                  select new Account()
                                  {
                                      my_var1 = a.myVar1,
                                      my_var2 = a.myVar2,
                                      AccountId = a.AccountId,
                                      anotherVar = a.alsoThisVar,
                                  }).ToList();

    }
    catch (FaultException ex)
    {
        Log.Debug($"GetCRMExistingAccounts Exception { ex.Message}");
        Console.WriteLine("GetCRMExistingAccounts Exception " + ex.Message);
        throw new Exception(ex.Message);
    }

    return CRMExisterendeAccounts;
}

是的,我的变量在我的系统中有不同的名称。 查询使用所有正确的数据返回对象。

1 个答案:

答案 0 :(得分:1)

您可以通过以下两种方法之一解决此问题:

1)使用MergeOption设置为MergeOption.NoTracking创建CRM2011DataContext。从未跟踪的上下文加载的实体将具有一个空的EntityState属性。

2)您可以创建实体的副本并保存副本。