Hi Charan,
Thanks for your response.Yes earlier i was using 1: N between case& User entity but now i have created new N:N relationship as it didn't worked for all the case so we need ti use here N:N & here user is modifying has admin access
& in plugin reg tool am using message on update post operation
& below modified code am using : & getting error now
An error occurred in the Update GE Compliance counsel Plug-in: An error occurred in the DisassociateComplianceCounselGrid method: Incident With Id = 8c3d6504-0fa3-ea11-a81d-001dd8b70014 Does Not Exist
Anything wrong in below code ?
using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
namespace MIC_CRM.GroupCompliance.Plugins.Case.Conflict_of_Interest
{
public class UpdateGEComplianceCounsel : IPlugin
{
OrganizationServiceContext organizationServiceContext;
IOrganizationService organizationService;
Guid divisionId = Guid.Empty, assetId = Guid.Empty;
public void Execute(IServiceProvider serviceProvider)
{
try
{
IPluginExecutionContext executionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
organizationService = serviceFactory.CreateOrganizationService(executionContext.UserId);
organizationServiceContext = new OrganizationServiceContext(organizationService);
bool IsGridData = true;
if (executionContext.MessageName.ToUpper() == "UPDATE")
{
if (executionContext.InputParameters.Contains("Target") && (executionContext.InputParameters["Target"] is Entity))
{
Entity incident = (Entity)executionContext.InputParameters["Target"];
if (incident == null || incident.LogicalName != "incident")
{
tracingService.Trace("Target is not as expected");
return;
}
organizationServiceContext.ClearChanges();
var incidentdtls = (from tra in organizationServiceContext.CreateQuery("incident")
where (Guid)tra["incidentid"] == incident.Id
select new
{
division = tra.Contains("mdc_relateddivision") ? ((EntityReference)tra["mdc_relateddivision"]).Id : Guid.Empty,
asset = tra.Contains("mdc_relatedasset") ? ((EntityReference)tra["mdc_relatedasset"]).Id : Guid.Empty
}).FirstOrDefault();
//ColumnSet attributes = new ColumnSet(new string[] { "mdc_relateddivision", "mdc_relatedasset" });
//Entity entityCase = organizationService.Retrieve(incident.LogicalName, incident.Id, attributes);
//tracingService.Trace("Retrieved Incident");
//EntityReference division = entityCase.Attributes.Contains("mdc_relateddivision") ? entityCase?.GetAttributeValue<EntityReference>("mdc_relateddivision") : null;
//var division = entityCase.Contains("mdc_relateddivision") ? ((EntityReference)entityCase["mdc_relateddivision"]).Id : Guid.Empty;
var division = incidentdtls.division;
tracingService.Trace("Division got....");
//EntityReference asset = entityCase.Attributes.Contains("mdc_relatedasset") ? entityCase?.GetAttributeValue<EntityReference>("mdc_relatedasset") : null;
//var asset = entityCase.Contains("mdc_relatedasset") ? ((EntityReference)entityCase["mdc_relatedasset"]).Id : Guid.Empty;
var asset = incidentdtls.asset;
tracingService.Trace("Asset value got....");
//throw new InvalidPluginExecutionException("Asset : ")
if (asset != Guid.Empty)
{
//assetId = (entityCase?.GetAttributeValue<EntityReference>("mdc_relatedasset")).Id;
DisassociateComplianceCounselGrid(incident, tracingService, ref IsGridData);
if (IsGridData) //Check Compliance Counsel grid has no records then Associate Users
{
tracingService.Trace($"Grid has no records");
QueryExpression query = new QueryExpression();
query.EntityName = "systemuser";
query.ColumnSet = new ColumnSet(true);
Relationship relationship = new Relationship();
query.Criteria = new FilterExpression();
relationship.SchemaName = "mdc_mdc_asset_systemuser";
tracingService.Trace($"Relationship exists");
RelationshipQueryCollection relatedEntity = new RelationshipQueryCollection();
relatedEntity.Add(relationship, query);
RetrieveRequest request = new RetrieveRequest();
request.RelatedEntitiesQuery = relatedEntity;
request.ColumnSet = new ColumnSet("mdc_assetid");
request.Target = new EntityReference { Id = asset, LogicalName = "mdc_asset" };
RetrieveResponse response = (RetrieveResponse)organizationService.Execute(request);
tracingService.Trace($"Got Response");
List<Entity> relatedEntities = new List<Entity>();
if (((((RelatedEntityCollection)(response.Entity.RelatedEntities)))).Contains(new Relationship("mdc_mdc_asset_systemuser")) &&
((((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("mdc_mdc_asset_systemuser")].Entities.Count > 0)
{
foreach (var item in ((((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("mdc_mdc_asset_systemuser")].Entities)
{
relatedEntities.Add(item);
AssociateRequest request1 = new AssociateRequest();
if (incident.Id != Guid.Empty)
request1.Target = new EntityReference(incident.LogicalName, incident.Id);
request1.RelatedEntities = new EntityReferenceCollection();
if (item.Id != Guid.Empty)
request1.RelatedEntities.Add(new EntityReference("systemuser", item.Id));
request1.Relationship = new Relationship("mdc_incident_systemusernew");
organizationService.Execute(request1);
tracingService.Trace($"Associated Users for Asset successfully");
}
}
}
}
else if (division != Guid.Empty)
{
//divisionId = (entityCase?.GetAttributeValue<EntityReference>("mdc_relateddivision")).Id;
DisassociateComplianceCounselGrid(incident, tracingService, ref IsGridData);
if (IsGridData) //Check Compliance Counsel grid has no records then Associate Users
{
tracingService.Trace($"Grid has no records");
QueryExpression query = new QueryExpression();
query.EntityName = "systemuser";
query.ColumnSet = new ColumnSet(true);
Relationship relationship = new Relationship();
query.Criteria = new FilterExpression();
relationship.SchemaName = "mdc_mdc_division_systemuser";
tracingService.Trace($"Relationship exists");
RelationshipQueryCollection relatedEntity = new RelationshipQueryCollection();
relatedEntity.Add(relationship, query);
RetrieveRequest request = new RetrieveRequest();
request.RelatedEntitiesQuery = relatedEntity;
request.ColumnSet = new ColumnSet("mdc_divisionid");
request.Target = new EntityReference { Id = division, LogicalName = "mdc_division" };
RetrieveResponse response = (RetrieveResponse)organizationService.Execute(request);
tracingService.Trace($"Got Response");
List<Entity> relatedEntities = new List<Entity>();
if (((((RelatedEntityCollection)(response.Entity.RelatedEntities)))).Contains(new Relationship("mdc_mdc_division_systemuser")) &&
((((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("mdc_mdc_division_systemuser")].Entities.Count > 0)
{
foreach (var item in ((((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("mdc_mdc_division_systemuser")].Entities)
{
relatedEntities.Add(item);
AssociateRequest request1 = new AssociateRequest();
if (incident.Id != Guid.Empty)
request1.Target = new EntityReference(incident.LogicalName, incident.Id);
request1.RelatedEntities = new EntityReferenceCollection();
if (item.Id != Guid.Empty)
request1.RelatedEntities.Add(new EntityReference("systemuser", item.Id));
request1.Relationship = new Relationship("mdc_incident_systemusernew");
organizationService.Execute(request1);
tracingService.Trace($"Associated Users successfully");
}
}
}
}
}
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("An error occurred in the Update GE Compliance counsel Plug-in: " + ex.Message, ex);
}
}
private void DisassociateComplianceCounselGrid(Entity incident, ITracingService tracingService, ref bool IsGridData)
{
try
{
Guid emailSendID = Guid.Empty;
if (incident != null)
{
QueryExpression query = new QueryExpression("systemuser"); //Name of the entity to be passed whose records need to be retrieved
var nIsToNRelationshipName = "mdc_incident_systemusernew"; //schema name of N:N relationship
query.ColumnSet = new ColumnSet(true);
var link = query.AddLink(nIsToNRelationshipName, "systemuserid", "systemuserid");
//Method Signature: AddLink("N:N schema name to be passed", "Primary key ID schema name of entity record to be retrieved", "schema name of attribute in the N:N relationship")
// emailSendID = incident.Id;//sample ID of Email Send record for which we are retrieving related records
link.LinkCriteria = new FilterExpression()
{
Conditions =
{
new ConditionExpression("incidentid", ConditionOperator.Equal, incident.Id)
// Filter condition to get related marketing lists of an Email Send record
}
};
EntityCollection collRecords = organizationService.RetrieveMultiple(query);
if (collRecords != null && collRecords.Entities != null && collRecords.Entities.Count > 0)
{
EntityReferenceCollection collection = new EntityReferenceCollection();
foreach (var entity in collRecords.Entities)
{
var reference = new EntityReference("systemuser", entity.Id);
collection.Add(reference); //Create a collection of entity references
}
Relationship relationship = new Relationship("mdc_incident_systemusernew"); //schema name of N:N relationship
organizationService.Disassociate("systemuser", incident.Id, relationship, collection); //Pass the entity reference collections to be disassociated from the specific Email Send record
}
}
////Retrieving Compliance Counsel grid records
//ConditionExpression condition = new ConditionExpression();
////condition.AttributeName = "mdc_incident_systemusernew";
//condition.AttributeName = "mdc_compliancecounselid";
//condition.Operator = ConditionOperator.Equal;
//if (incident.Id != Guid.Empty)
// condition.Values.Add(incident.Id);
//tracingService.Trace("incident exists");
////Create a column set.
//ColumnSet columns = new ColumnSet(true);
//QueryExpression query1 = new QueryExpression();
//query1.ColumnSet = columns;
//query1.EntityName = "systemuser";
//query1.Criteria.AddCondition(condition);
//List<Entity> relatedUsers = new List<Entity>();
//EntityCollection resColl = organizationService.RetrieveMultiple(query1);
//tracingService.Trace($"Subgrid records found");
//if (resColl?.Entities.Count > 0)
//{
// IsGridData = true;
// tracingService.Trace($"subgrid has data");
// foreach (var r in resColl.Entities)
// {
// relatedUsers.Add(r);
// DisassociateRequest disassociateReq = new DisassociateRequest();
// if (incident.Id != Guid.Empty)
// disassociateReq.Target = new EntityReference("incident", incident.Id);
// disassociateReq.RelatedEntities = new EntityReferenceCollection();
// if (r.Id != Guid.Empty)
// disassociateReq.RelatedEntities.Add(new EntityReference("systemuser", r.Id));
// disassociateReq.Relationship = new Relationship("mdc_incident_systemusernew");
// organizationService.Execute(disassociateReq);
// tracingService.Trace($"Disaasociated Users successfully");
// }
//}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("An error occurred in the DisassociateComplianceCounselGrid method: " + ex.Message, ex);
}
}
}
}
Thanks,
Jharana