Solution Component types in Dynamics 365
CRM 2016 brought one great improvement – possibility to choose what subcomponents we want to include in the solution. We can choose single fields, views or relationships for an entity. Previously when an entity has been added to a solution, all its subcomponents were automatically added to this solution. This great feature allows to better control what is transferred between environments. Who has never imported a view or some chart that was changed on testing environment to live environment, by accident, please raise your hand. Currently we can include only the components that were changed and make sure nothing else will come along. Of course, it requires changing the mindset – quite recently I was asking a many-year CRM customizer, why he has added all components for Account entity to our solution, if the only thing that was changed were few added fields. “Because it always was like that” is not satisfying answer for me, as you probably already figured out 🙂
Because of this new feature, I believe that it’s important to better understand what is in fact kept in the solution from the metadata and data perspective. Every element in a solution is called Solution Component. It’s a simple entity that has a type and few values that help identify it (like ObjectId) if it’s a metadata or data component and if it includes all Subcomponents, does not include subcomponents or is only a shell of a component. Documentation on MSDN (https://msdn.microsoft.com/en-us/library/mt608054.aspx) clearily defines all solution component types, and the most important fields, which are:
- componenttype: The object type code of the component.
- ismetadata: Indicates whether this component is metadata or data. (1 : Metadata, 0 : Data)
- objectid: Unique identifier of the object with which the component is associated
- rootcomponentbehavior: Indicates the include behavior of the root component (0 : Include Subcomponents, 1 : Do not include subcomponents, 2 : Include As Shell Only)
- rootsolutioncomponentid: The parent ID of the subcomponent, which will be a root
I researched all available solution components. Below you can find a summary of their names, logical names, short description and how to get them using SDK. Basically there are three ways of getting this data using SDK:
- Using dedicated OrganizationRequest: for example EntityMetadata, AttributeMetadata etc
- Using RetrieveRequest (or simply IOrganizationService Retrieve message)
- Using RetrieveMultiple specifying QueryExpression with proper entity name and id equal to ObjectId from Solution Component object. Don’t ask me why simple Retrieve does not work for this components – it simply does not.
Interesting thing is that some components are known as not-transferable through solution (like Duplicate Detection Rules). I will try to investigate in the future if it’s possible to add them to the solution using SDK and successfully transfer to another environment using solution.
UPDATE: I investigated if it’s possible to add a solution component that is listed below, but it’s not available through UI, so for example Duplicate Detection Rule:
var solutionComponentRequest = new AddSolutionComponentRequest()
{
ComponentType = 44,
ComponentId = duplicateRule.Id,
SolutionUniqueName = "solutionName"
};
service.Execute(solutionComponentRequest);
Unfortunately such operation ends with with an exception:
An unhandled exception of type 'System.ServiceModel.FaultException`1' occurred in Microsoft.Xrm.Tooling.Connector.dll
Additional information: Invalid component type provided 44
Solution components summary:
Type | Name | Logicalname | Comment | SDK |
1 | Entity | n/a | Entity metadata | RetrieveEntityRequest |
2 | Attribute | n/a | Attribute metadata | RetrieveAttributeRequest |
3 | Relationship | n/a | Relationship metadata, but it’s always bound to EntityRelationship metadata, internal | Obtained together with EntityMetadata using RetrieveRelationshipRequest |
4 | AttributePicklistValue | n/a | Value of the option set option, internal | – |
5 | AttributeLookupValue | n/a | Value of the lookup text, internal | – |
6 | ViewAttribute | n/a | Attributes used in views, internal | – |
7 | LocalizedLabel | n/a | Localized label (metadata in CRM that you can localize) | RetrieveLocLabelsRequest |
8 | RelationshipExtraCondition | n/a | Relationship metadata, internal | Obtained together with EntityMetadata using RetrieveRelationshipRequest |
9 | OptionSet | n/a | Option set metadata | RetrieveOptionSetRequest |
10 | EntityRelationship | n/a | Entity relationship metadata | RetrieveRelationshipRequest |
11 | EntityRelationshipRole | n/a | Relationship role (feature depreciated since CRM 2011, after introducing Connections) | – |
12 | EntityRelationshipRelationships | n/a | Mapping between EntityRelationship and Relationship, internal | Obtained together with EntityMetadata using RetrieveRelationshipRequest |
13 | ManagedProperty | n/a | Managed property metadata | RetrieveManagedPropertyRequest |
14 | EntityKey | n/a | Entity key metadata | RetrieveEntityKeyRequest |
20 | Role | role | Security role | RetrieveRequest (Target = role) |
21 | Role Privilege | roleprivileges | Security role privilege | RetrieveRequest (Target = roleprivileges) |
22 | Display String | displaystring | Display string | RetrieveRequest (Target = displaystring) |
23 | Display String Map | displaystringmap | Display string mapping | RetrieveRequest (Target = displaystringmap) |
24 | Form | form | internal | – |
25 | Organization | organization | Organization entity | RetrieveRequest (Target = organization) |
26 | Saved Query | savedquery | View | RetrieveRequest (Target = savedquery) |
29 | Workflow | workflow | Process | RetrieveRequest (Target = workflow) |
31 | Report | report | Report | RetrieveRequest (Target = report) |
32 | Report Entity | reportentity | Entity bound to report | RetrieveRequest (Target = reportentity) |
33 | Report Category | reportcategory | Category of report | RetrieveRequest (Target = reportcategory) |
34 | Report Visibility | reportvisibility | Visibility of report | RetrieveRequest (Target = reportvisibility) |
35 | Attachment | attachment | Attachment entity | RetrieveMultiple request using QueryExpression(“attachment”) |
36 | Email Template | template | Email template | RetrieveRequest (Target = template) |
37 | Contract Template | contracttemplate | Contract template | RetrieveRequest (Target = contracttemplate) |
38 | KB Article Template | kbarticletemplate | KB Article template | RetrieveRequest (Target = kbarticletemplate) |
39 | Mail Merge Template | mailmergetemplate | MailMerge template | RetrieveRequest (Target = mailmergetemplate) |
44 | Duplicate Rule | duplicaterule | Duplicate rule | RetrieveRequest (Target = duplicaterule) |
45 | Duplicate Rule Condition | duplicaterulecondition | Duplicate rule condition | RetrieveRequest (Target = duplicaterulecondition) |
46 | Entity Map | entitymap | Entity mapping | RetrieveRequest (Target = entitymap) |
47 | Attribute Map | attributemap | Attribute mapping | RetrieveRequest (Target = attributemap) |
48 | Ribbon Command | ribboncommand | Ribbon command | RetrieveMultiple request using QueryExpression(“ribboncommand”) |
49 | Ribbon Context Group | ribboncontextgroup | Ribbon context group | RetrieveMultiple request using QueryExpression(“ribboncontextgroup”) |
50 | Ribbon Customization | ribboncustomization | Ribbon customization (Application Ribbon) | RetrieveMultiple request using QueryExpression(“ribboncustomization”) or you can use RetrieveApplicationRibbonRequest |
52 | Ribbon Rule | ribbonrule | Ribbon rule | RetrieveMultiple request using QueryExpression(“ribbonrule”) |
53 | Ribbon Tab To Command Map | ribbontabtocommandmap | Ribbon tab to command mapping | RetrieveMultiple request using QueryExpression(“ribbontabtocommandmap”) |
55 | Ribbon Diff | ribbondiff | Ribbon diff | RetrieveMultiple request using QueryExpression(“ribbondiff”) |
59 | Saved Query Visualization | savedqueryvisualization | Chart | RetrieveRequest (Target = savedqueryvisualization) |
60 | System Form | systemform | Form | RetrieveRequest (Target = systemform) |
61 | Web Resource | webresource | Web resource | RetrieveRequest (Target = webresource) |
62 | Site Map | sitemap | Site map | RetrieveRequest (Target = sitemap) |
63 | Connection Role | connectionrole | Connection role | RetrieveRequest (Target = connectionrole) |
65 | Hierarchy Rule | hierarchyrule | Hierarchy rule | RetrieveRequest (Target = hierarchyrule) |
66 | Custom Control | customcontrol | Custom control | RetrieveRequest (Target = customcontrol) |
68 | Custom Control Default Config | customcontroldefaultconfig | Custom control default config | RetrieveRequest (Target = customcontroldefaultconfig) |
70 | Field Security Profile | fieldsecurityprofile | Field Security Profile | RetrieveRequest (Target = fieldsecurityprofile) |
71 | Field Permission | fieldpermission | Field permission | RetrieveRequest (Target = fieldpermission) |
80 | App Module | appmodule | App module | RetrieveMultiple request using QueryExpression(“appmodule”) |
90 | Plugin Type | plugintype | Plugin type | RetrieveRequest (Target = plugintype) |
91 | Plugin Assembly | pluginassembly | Plugin assembly | RetrieveRequest (Target = pluginassembly) |
92 | SDK Message Processing Step | sdkmessageprocessingstep | Plugin step | RetrieveRequest (Target = sdkmessageprocessingstep) |
93 | SDK Message Processing Step Image | sdkmessageprocessingstepimage | Plugin step image | RetrieveRequest (Target = sdkmessageprocessingstepimage) |
95 | Service Endpoint | serviceendpoint | Service endpoint | RetrieveRequest (Target = serviceendpoint) |
150 | Routing Rule | routingrule | Routing rule | RetrieveRequest (Target = routingrule) |
151 | Routing Rule Item | routingruleitem | Routing rule item | RetrieveRequest (Target = routingruleitem) |
152 | SLA | sla | Sla agreement | RetrieveRequest (Target = sla) |
153 | SLA Item | slaitem | Sla item | RetrieveRequest (Target = slaitem) |
154 | Convert Rule | convertrule | Automatic creation rule | RetrieveRequest (Target = convertrule) |
155 | Convert Rule Item | convertruleitem | Automatic creation rule item | RetrieveRequest (Target = convertruleitem) |
161 | Mobile Offline Profile | mobileofflineprofile | Mobile offline profile | RetrieveRequest (Target = mobileofflineprofile) |
162 | Mobile Offline Profile Item | mobileofflineprofileitem | Mobile offline profile item | RetrieveRequest (Target = mobileofflineprofileitem) |
165 | Similarity Rule | similarityrule | Similarity rule | RetrieveRequest (Target = similarityrule) |