/// <summary> /// Merge the information from two entity records of the same type. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.mergerequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="mergeEntityType">Entity type that merged</param> /// <param name="masterRecordId">Target (merged to) of the merge operation</param> /// <param name="subordinateId">Id of the entity record from which to merge data</param> /// <param name="updatedContent">Additional entity attributes to be set during the merge operation for accounts, contacts, or leads. This property is not applied when merging incidents</param> /// <param name="performParentingChecks">Indicates whether to check if the parent information is different for the two entity records.</param> /// <returns> /// <see cref="MergeResponse"/> /// </returns> public MergeResponse Merge(MergeEntity mergeEntityType, Guid masterRecordId, Guid subordinateId, Entity updatedContent, bool performParentingChecks = false) { /* * MergeRequest CRM SDK notları * https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.mergerequest.aspx * * 2015-10-01 : Entities that support MERGE operation * - Lead * - Account * - Contact * - Incident * * Incident(Case) için kısıtlamalar * - UpdateContent property kullanılamaz. * https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.mergerequest.updatecontent.aspx * https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.mergerequest_members.aspx adresinde "MergeRequest.UpdateContent" optional görünmesine rağmen , * boş gönderilince hata veriyor. Bu nedenle "Incident" için kullanımda new Entity("incident") ataması yapıyoruz */ ExceptionThrow.IfGuidEmpty(subordinateId, "mergedRecordId"); ExceptionThrow.IfGuidEmpty(masterRecordId, "mergeToRecordId"); ExceptionThrow.IfNull(updatedContent, "updatedContent"); ExceptionThrow.IfNotExpectedValue(updatedContent.LogicalName, mergeEntityType.Description(), "UpdatedContent.LogicalName"); MergeRequest request = new MergeRequest() { Target = new EntityReference(mergeEntityType.Description(), masterRecordId), SubordinateId = subordinateId, PerformParentingChecks = performParentingChecks, UpdateContent = updatedContent }; return((MergeResponse)this.OrganizationService.Execute(request)); }
private void DoSingleEntityReplaceFail(TablePayloadFormat format) { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext secondContext = tableClient.GetTableServiceContext(); SetPayloadFormatOnDataServiceContext(ctx, format, tableClient); SetPayloadFormatOnDataServiceContext(secondContext, format, tableClient); // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo" + format.ToString()); baseEntity.Randomize(); ctx.AddObject(currentTable.Name, baseEntity); ctx.SaveChangesWithRetries(); string etag = ctx.Entities.First().ETag; baseEntity.A = "updated"; ctx.UpdateObject(baseEntity); ctx.SaveChangesWithRetries(); MergeEntity replaceEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); replaceEntity.Randomize(); secondContext.AttachTo(currentTable.Name, replaceEntity, etag); secondContext.UpdateObject(replaceEntity); OperationContext opContext = new OperationContext(); try { secondContext.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate, null, opContext); Assert.Fail(); } catch (StorageException) { TestHelper.ValidateResponse(opContext, 1, (int)HttpStatusCode.PreconditionFailed, new string[] { "UpdateConditionNotSatisfied", "ConditionNotMet" }, new string[] { "The update condition specified in the request was not satisfied.", "The condition specified using HTTP conditional header(s) is not met." }); } ctx.DeleteObject(baseEntity); ctx.SaveChangesWithRetries(); opContext = new OperationContext(); // try merging with deleted entity try { secondContext.SaveChangesWithRetries(SaveChangesOptions.None, null, opContext); Assert.Fail(); } catch (StorageException) { TestHelper.ValidateResponse(opContext, 1, (int)HttpStatusCode.NotFound, new string[] { "ResourceNotFound" }, "The specified resource does not exist."); } }
private void DoSingleEntityInsertOrReplace(TablePayloadFormat format) { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext queryContext = tableClient.GetTableServiceContext(); queryContext.MergeOption = MergeOption.NoTracking; SetPayloadFormatOnDataServiceContext(ctx, format, tableClient); SetPayloadFormatOnDataServiceContext(queryContext, format, tableClient); // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo" + format.ToString()); // Insert Or Merge with no pre-existing entity MergeEntity insertOrReplaceEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); insertOrReplaceEntity.Randomize(); ctx.AttachTo(currentTable.Name, insertOrReplaceEntity, null); ctx.UpdateObject(insertOrReplaceEntity); ctx.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); ctx.Detach(insertOrReplaceEntity); // Retrieve Entity & Verify Contents UnionEnitity retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(null, retrievedEntity.A); Assert.AreEqual(null, retrievedEntity.B); Assert.AreEqual(null, retrievedEntity.C); Assert.AreEqual(insertOrReplaceEntity.D, retrievedEntity.D); Assert.AreEqual(insertOrReplaceEntity.E, retrievedEntity.E); Assert.AreEqual(insertOrReplaceEntity.F, retrievedEntity.F); BaseEntity replacedEntity = new BaseEntity("insert test", "foo" + format.ToString()); replacedEntity.Randomize(); ctx.AttachTo(currentTable.Name, replacedEntity, null); ctx.UpdateObject(replacedEntity); ctx.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); // Retrieve Entity & Verify retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(replacedEntity.A, retrievedEntity.A); Assert.AreEqual(replacedEntity.B, retrievedEntity.B); Assert.AreEqual(replacedEntity.C, retrievedEntity.C); Assert.AreEqual(null, retrievedEntity.D); Assert.AreEqual(null, retrievedEntity.E); Assert.AreEqual(null, retrievedEntity.F); }
public void SingleEntityInsertOrMerge() { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext queryContext = tableClient.GetTableServiceContext(); // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo"); // Insert Or Merge with no pre-existing entity MergeEntity insertOrMergeEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); insertOrMergeEntity.Randomize(); ctx.AttachTo(currentTable.Name, insertOrMergeEntity, null); ctx.UpdateObject(insertOrMergeEntity); ctx.SaveChangesWithRetries(); ctx.Detach(insertOrMergeEntity); // Retrieve Entity & Verify Contents UnionEnitity retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(ctx).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(insertOrMergeEntity.D, retrievedEntity.D); Assert.AreEqual(insertOrMergeEntity.E, retrievedEntity.E); Assert.AreEqual(insertOrMergeEntity.F, retrievedEntity.F); UnionEnitity mergedEntity = new UnionEnitity("insert test", "foo"); mergedEntity.Randomize(); mergedEntity.D = insertOrMergeEntity.D; mergedEntity.E = insertOrMergeEntity.E; mergedEntity.F = insertOrMergeEntity.F; ctx.AttachTo(currentTable.Name, mergedEntity, null); ctx.UpdateObject(mergedEntity); ctx.SaveChangesWithRetries(); ctx.Detach(mergedEntity); // Retrieve Entity & Verify retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(mergedEntity.A, retrievedEntity.A); Assert.AreEqual(mergedEntity.B, retrievedEntity.B); Assert.AreEqual(mergedEntity.C, retrievedEntity.C); Assert.AreEqual(mergedEntity.D, retrievedEntity.D); Assert.AreEqual(mergedEntity.E, retrievedEntity.E); Assert.AreEqual(mergedEntity.F, retrievedEntity.F); }
private void DoSingleEntityMerge(TablePayloadFormat format) { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext queryContext = tableClient.GetTableServiceContext(); SetPayloadFormatOnDataServiceContext(ctx, format, tableClient); SetPayloadFormatOnDataServiceContext(queryContext, format, tableClient); // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo" + format.ToString()); baseEntity.Randomize(); ctx.AddObject(currentTable.Name, baseEntity); ctx.SaveChangesWithRetries(); string etag = ctx.Entities.First().ETag; ctx.Detach(baseEntity); MergeEntity mergeEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); mergeEntity.Randomize(); ctx.AttachTo(currentTable.Name, mergeEntity, etag); ctx.UpdateObject(mergeEntity); ctx.SaveChangesWithRetries(); // Retrieve Entity UnionEnitity retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(baseEntity.A, retrievedEntity.A); Assert.AreEqual(baseEntity.B, retrievedEntity.B); Assert.AreEqual(baseEntity.C, retrievedEntity.C); Assert.AreEqual(mergeEntity.D, retrievedEntity.D); Assert.AreEqual(mergeEntity.E, retrievedEntity.E); Assert.AreEqual(mergeEntity.F, retrievedEntity.F); }
public void SingleEntityReplace() { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext queryContext = tableClient.GetTableServiceContext(); // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo"); baseEntity.Randomize(); ctx.AddObject(currentTable.Name, baseEntity); ctx.SaveChangesWithRetries(); string etag = ctx.Entities.First().ETag; ctx.Detach(baseEntity); MergeEntity replaceEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); replaceEntity.Randomize(); ctx.AttachTo(currentTable.Name, replaceEntity, etag); ctx.UpdateObject(replaceEntity); ctx.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); // Retrieve Entity UnionEnitity retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(null, retrievedEntity.A); Assert.AreEqual(null, retrievedEntity.B); Assert.AreEqual(null, retrievedEntity.C); Assert.AreEqual(replaceEntity.D, retrievedEntity.D); Assert.AreEqual(replaceEntity.E, retrievedEntity.E); Assert.AreEqual(replaceEntity.F, retrievedEntity.F); }
public void SingleEntityInsertOrReplaceAPM() { CloudTableClient tableClient = GenerateCloudTableClient(); TableServiceContext ctx = tableClient.GetTableServiceContext(); TableServiceContext queryContext = tableClient.GetTableServiceContext(); queryContext.MergeOption = MergeOption.NoTracking; // Insert Entity BaseEntity baseEntity = new BaseEntity("insert test", "foo"); // Insert Or Merge with no pre-existing entity MergeEntity insertOrReplaceEntity = new MergeEntity(baseEntity.PartitionKey, baseEntity.RowKey); insertOrReplaceEntity.Randomize(); ctx.AttachTo(currentTable.Name, insertOrReplaceEntity, null); ctx.UpdateObject(insertOrReplaceEntity); using (ManualResetEvent evt = new ManualResetEvent(false)) { IAsyncResult asyncRes = null; ctx.BeginSaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate, (res) => { asyncRes = res; evt.Set(); }, null); evt.WaitOne(); ctx.EndSaveChangesWithRetries(asyncRes); } ctx.Detach(insertOrReplaceEntity); // Retrieve Entity & Verify Contents UnionEnitity retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(null, retrievedEntity.A); Assert.AreEqual(null, retrievedEntity.B); Assert.AreEqual(null, retrievedEntity.C); Assert.AreEqual(insertOrReplaceEntity.D, retrievedEntity.D); Assert.AreEqual(insertOrReplaceEntity.E, retrievedEntity.E); Assert.AreEqual(insertOrReplaceEntity.F, retrievedEntity.F); BaseEntity replacedEntity = new BaseEntity("insert test", "foo"); replacedEntity.Randomize(); ctx.AttachTo(currentTable.Name, replacedEntity, null); ctx.UpdateObject(replacedEntity); using (ManualResetEvent evt = new ManualResetEvent(false)) { IAsyncResult asyncRes = null; ctx.BeginSaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate, (res) => { asyncRes = res; evt.Set(); }, null); evt.WaitOne(); ctx.EndSaveChangesWithRetries(asyncRes); } // Retrieve Entity & Verify retrievedEntity = (from ent in queryContext.CreateQuery <UnionEnitity>(currentTable.Name) where ent.PartitionKey == baseEntity.PartitionKey && ent.RowKey == baseEntity.RowKey select ent).AsTableServiceQuery(queryContext).Execute().FirstOrDefault(); Assert.IsNotNull(retrievedEntity); Assert.AreEqual(replacedEntity.A, retrievedEntity.A); Assert.AreEqual(replacedEntity.B, retrievedEntity.B); Assert.AreEqual(replacedEntity.C, retrievedEntity.C); Assert.AreEqual(null, retrievedEntity.D); Assert.AreEqual(null, retrievedEntity.E); Assert.AreEqual(null, retrievedEntity.F); }