microsoft / PowerPlatform-DataverseServiceClient

Code Replica for Microsoft.PowerPlatform.Dataverse.Client and supporting nuget packages.
MIT License
281 stars 51 forks source link

Unable to delete record using alternate key #205

Closed LarsBauer closed 2 years ago

LarsBauer commented 2 years ago

Hi,

Unfortunately when trying to delete a record using alternate key I receive the following exception.

My code snippet

var request = new DeleteRequest
{
    Target = new EntityReference(Account.EntityLogicalName)
    {
        KeyAttributes = new KeyAttributeCollection
        {
            { Account.LogicalNames.MyAlternateKey, key}
        }
    }
};

_context.Execute(request); /* OrganizationServiceContext */

Exception

Microsoft.PowerPlatform.Dataverse.Client.Utils.DataverseOperationException: Entity Reference cannot have Id and Key Attributes empty.
 ---> Microsoft.Rest.HttpOperationException: Operation returned an invalid status code 'BadRequest'
   at Microsoft.PowerPlatform.Dataverse.Client.ConnectionService.ExecuteHttpRequestAsync(String uri, HttpMethod method, String body, Dictionary`2 customHeaders, CancellationToken cancellationToken, DataverseTraceLogger logSink, Nullable`1 requestTrackingId, String contentType, Nullable`1 sessionTrackingId, HttpClient providedHttpClient)
   at Microsoft.PowerPlatform.Dataverse.Client.ConnectionService.Command_WebExecuteAsync(String queryString, String body, HttpMethod method, Dictionary`2 customHeaders, String contentType, String errorStringCheck, Guid callerId, Boolean disableConnectionLocking, Int32 maxRetryCount, TimeSpan retryPauseTime, Uri uriOfInstance, Guid requestTrackingId, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.PowerPlatform.Dataverse.Client.ServiceClient.Execute(OrganizationRequest request)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest request)

I investigated further and have found the root cause of this issue here: https://github.com/microsoft/PowerPlatform-DataverseServiceClient/blob/e365070688405e0b5683df589ae8eb94557cee34/src/GeneralTools/DataverseClient/Client/ConnectionService.cs#L1582-L1585

As you can see the problem is that the KeyAttributes won't get evaluated when the Target parameter is of type EntityReference and so the request url will be invalid: accounts(00000000-0000-0000-0000-000000000000)

Let me know if I should provide a fix via PR. Thanks in advance!

MattB-msft commented 2 years ago

We have accepted your changes, but cannot commit the PR here as it will be overwritten by the master, we will link the Update to this issue to close it when we push it live.

Thanks for your help @LarsBauer !

LarsBauer commented 2 years ago

Hi @MattB-msft sorry for the late reply... These are great news! So should I close my pending PR or will it be merged once your internal repo is mirrored?

MattB-msft commented 2 years ago

We will take care of it when the publish happens. Thanks !