3

In my C# console application I am trying to update an account in CRM 2016. IsFaulted keeps returning true. The error message it returns when I drill down is the following:

EntityState must be set to null, Created (for Create message) or Changed (for Update message).

Also in case it might cause the fault I have pasted my LINQ query at the bottom.

The answers I get from Google states either that I am mixing ServiceContext and ProxyService (which am not, I am not using it in this context). The others says that I am using context.UpdateObject(object) incorrectly, which I am not using either.

Update: Someone just informed me that the above error is caused because I am trying to return all the metadata and not just the updated data. Still I have no idea how to fix the error, but this information should be helpful.

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 below

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;
}

And yes, my variables has different names in my system. The query returns the object just fine with all the correct data.

ToFo
  • 1,643
  • 1
  • 19
  • 34

1 Answers1

1

You can work around this in one of two ways:

1) Create your CRM2011DataContext with the MergeOption set to MergeOption.NoTracking. Entities loaded from a context that is not tracking will have a null EntityState property.

2) You can create a copy of your Entity and save the copy.

John Atwood
  • 1,505
  • 10
  • 19