private static void AssertEntityReferencesExists(LocalCrmDatabaseOrganizationService service, Entity entity) { foreach (var foreign in entity.Attributes.Select(attribute => attribute.Value).OfType <EntityReference>()) { #if !PRE_KEYATTRIBUTE if (foreign.Id == Guid.Empty && foreign.KeyAttributes.Count > 0) { var kvps = new List <object>(); foreach (var kvp in foreign.KeyAttributes) { kvps.Add(kvp.Key); kvps.Add(kvp.Value); } // Throw an error if not found. foreign.Id = service.GetFirst(foreign.LogicalName, kvps.ToArray()).Id; } else { #endif service.Retrieve(foreign.LogicalName, foreign.Id, new ColumnSet(false)); #if !PRE_KEYATTRIBUTE } } foreach (var att in entity.Attributes.Select(a => new { a.Key, Value = a.Value as EntityReference }) .Where(a => a.Value?.KeyAttributes.Count > 0).ToList()) { entity[att.Key] = new EntityReference(att.Value.LogicalName, att.Value.Id) { Name = att.Value.Name }; #endif } }
private static void UpdateOwningFieldsBasedOnOwner(LocalCrmDatabaseOrganizationService service, Entity entity, EntityProperties properties) { var ownerRef = entity.GetAttributeValue <EntityReference>(Email.Fields.OwnerId).Clone(); var owner = service.Retrieve(ownerRef.LogicalName, ownerRef.Id, new ColumnSet(true)); var bu = owner.GetAttributeValue <EntityReference>(SystemUser.Fields.BusinessUnitId) ?? owner.GetAttributeValue <EntityReference>(Email.Fields.OwningBusinessUnit); ownerRef.Name = null; // Clear Name value since owning field names aren't populated. var owningUser = owner.LogicalName == SystemUser.EntityLogicalName ? ownerRef : null; var owningTeam = owner.LogicalName == Team.EntityLogicalName ? ownerRef : null; ConditionallyAddValue(entity, properties, Email.Fields.OwningUser, owningUser); ConditionallyAddValue(entity, properties, Email.Fields.OwningTeam, owningTeam); if (bu == null) { return; } bu = bu.Clone(); bu.Name = null; ConditionallyAddValue(entity, properties, Email.Fields.OwningBusinessUnit, bu); ConditionallyAddValue(entity, properties, SystemUser.Fields.BusinessUnitId, bu); }
private static void AssertEntityReferencesExists(LocalCrmDatabaseOrganizationService service, Entity entity) { foreach (var foreign in entity.Attributes.Select(attribute => attribute.Value).OfType <EntityReference>()) { service.Retrieve(foreign.LogicalName, foreign.Id, new ColumnSet(true)); } }
private static void AssertConnectionRolesAreAssociated(LocalCrmDatabaseOrganizationService service, Entity entity, bool isUpdate, DelayedException exception) { var role1 = entity.GetAttributeValue <EntityReference>(Connection.Fields.Record1RoleId); var role2 = entity.GetAttributeValue <EntityReference>(Connection.Fields.Record2RoleId); if (isUpdate) { if (role1 == null && role2 == null) { // Role never got set, exit return; } if (role1 == null || role2 == null) { // One is null, attempt to populate it var dbVersion = service.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(true)); var dbRole1 = dbVersion.GetAttributeValue <EntityReference>(Connection.Fields.Record1RoleId); var dbRole2 = dbVersion.GetAttributeValue <EntityReference>(Connection.Fields.Record2RoleId); if (role1 == null) { role1 = role2.NullSafeEquals(dbRole1) ? dbRole2 : dbRole1; } else { role2 = role1.NullSafeEquals(dbRole2) ? dbRole1 : dbRole2; } } } if (role1 == null || role2 == null) { return; } var qe = new QueryExpression { ColumnSet = new ColumnSet(true), EntityName = ConnectionRoleAssociation.EntityLogicalName }; qe.First().WhereEqual( ConnectionRoleAssociation.Fields.ConnectionRoleId, role1.Id, ConnectionRoleAssociation.Fields.AssociatedConnectionRoleId, role2.Id, LogicalOperator.Or, ConnectionRoleAssociation.Fields.ConnectionRoleId, role2.Id, ConnectionRoleAssociation.Fields.AssociatedConnectionRoleId, role1.Id); if (!service.RetrieveMultiple(qe).Entities.Any()) { exception.Exception = CrmExceptions.GetFaultException(ErrorCodes.UnrelatedConnectionRoles); } }
/// <summary> /// Contact and Account Ids are populated by the customer id property. Handle hydrating values. /// </summary> private static void AutoPopulateOpportunityFields <T>(LocalCrmDatabaseOrganizationService service, T entity, bool isCreate) where T : Entity { if (entity.LogicalName != Opportunity.EntityLogicalName) { return; } var customer = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.CustomerId); var opp = isCreate ? new Entity() : service.Retrieve(Opportunity.EntityLogicalName, entity.Id, new ColumnSet(Opportunity.Fields.ParentAccountId, Opportunity.Fields.ParentContactId)); var parentName = "parent" + customer?.LogicalName + "id"; // Customer was set, set correct parent field to customer if (customer != null && !entity.Contains(parentName)) { entity[parentName] = customer; } var hadAccount = opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentAccountId) != null; var hadContact = opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId) != null; // Customer was cleared, set correct parent field to null; if (entity.ContainsNullValue("customerid")) { if (hadAccount) { entity[Opportunity.Fields.ParentAccountId] = null; } else if (hadContact) { entity[Opportunity.Fields.ParentContactId] = null; } } var hasAccount = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentAccountId) != null; var hasContact = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId) != null; var willHaveAccount = hasAccount || hadAccount && !entity.ContainsNullValue(Opportunity.Fields.ParentAccountId); var willHaveContact = hasContact || hadContact && !entity.ContainsNullValue(Opportunity.Fields.ParentContactId); if (hasAccount) { entity[Opportunity.Fields.CustomerId] = entity[Opportunity.Fields.ParentAccountId]; } else if (hasContact && !willHaveAccount) { entity[Opportunity.Fields.CustomerId] = entity[Opportunity.Fields.ParentContactId]; } if (!willHaveAccount && willHaveContact) { entity[Opportunity.Fields.CustomerId] = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId) ?? opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId); } else if (!willHaveAccount) { entity[Opportunity.Fields.CustomerId] = null; } }