/// <summary> /// Submit the specified <see cref="EntityChangeSet"/> to the DomainService, with the results of the operation /// being returned on the SubmitCompleted event args. /// </summary> /// <param name="changeSet">The changeset to submit. If the changeset is empty, an <see cref="InvalidOperationException"/> will /// be thrown.</param> /// <param name="cancellationToken"><see cref="CancellationToken"/> to be used for requesting cancellation</param> /// <returns>The results returned by the submit request.</returns> /// <exception cref="InvalidOperationException">The changeset is empty.</exception> protected override Task <SubmitCompletedResult> SubmitAsyncCore(EntityChangeSet changeSet, CancellationToken cancellationToken) { IEnumerable <ChangeSetEntry> submitOperations = changeSet.GetChangeSetEntries(); TContract channel = this.ChannelFactory.CreateChannel(); return(CallServiceOperation <SubmitCompletedResult>(channel, "SubmitChanges", new Dictionary <string, object>() { { "changeSet", submitOperations } }, (state, asyncResult) => { try { var returnValue = (IEnumerable <ChangeSetEntry>)EndServiceOperationCall(state, asyncResult); return new SubmitCompletedResult(changeSet, returnValue ?? Enumerable.Empty <ChangeSetEntry>()); } catch (FaultException <DomainServiceFault> fe) { throw WebDomainClient <TContract> .GetExceptionFromServiceFault(fe.Detail); } }, cancellationToken)); }
/// <summary> /// Submit the specified <see cref="EntityChangeSet"/> to the DomainService, with the results of the operation /// being returned on the SubmitCompleted event args. /// </summary> /// <param name="changeSet">The changeset to submit. If the changeset is empty, an <see cref="InvalidOperationException"/> will /// be thrown.</param> /// <param name="callback">The callback to invoke when the submit has been executed.</param> /// <param name="userState">Optional state that will flow through to the SubmitCompleted event</param> /// <returns>An asynchronous result that identifies this submit.</returns> /// <exception cref="InvalidOperationException">The changeset is empty.</exception> /// <exception cref="InvalidOperationException">The specified query does not exist.</exception> protected sealed override IAsyncResult BeginSubmitCore(EntityChangeSet changeSet, AsyncCallback callback, object userState) { MethodInfo beginSubmitMethod = WebDomainClient <TContract> .ResolveBeginMethod("SubmitChanges"); MethodInfo endSubmitMethod = WebDomainClient <TContract> .ResolveEndMethod("SubmitChanges"); IEnumerable <ChangeSetEntry> submitOperations = changeSet.GetChangeSetEntries(); TContract channel = this.ChannelFactory.CreateChannel(); WebDomainClientAsyncResult <TContract> wcfAsyncResult = WebDomainClientAsyncResult <TContract> .CreateSubmitResult(this, channel, endSubmitMethod, changeSet, submitOperations.ToList(), callback, userState); object[] parameters = { submitOperations, new AsyncCallback(delegate(IAsyncResult asyncResponseResult) { wcfAsyncResult.InnerAsyncResult = asyncResponseResult; wcfAsyncResult.Complete(); }), userState }; IAsyncResult asyncResult; try { asyncResult = (IAsyncResult)beginSubmitMethod.Invoke(channel, parameters); } catch (TargetInvocationException tie) { if (tie.InnerException != null) { throw tie.InnerException; } throw; } if (!asyncResult.CompletedSynchronously) { wcfAsyncResult.InnerAsyncResult = asyncResult; } return(wcfAsyncResult); }