DEVKIT1016 - phuocle/Dynamics-Crm-DevKit GitHub Wiki
This analyzer detects usage of RetrieveAsIfPublished = true on metadata requests. Retrieving unpublished metadata adds overhead to processing and can return metadata that users might not expect.
Retrieving unpublished metadata not only adds overhead to processing the request itself, performing more slowly, it could also return metadata that the requestor doesn't expect.
When you retrieve unpublished metadata:
- Slower Performance: The query has more overhead
- User Confusion: Returns customizations that haven't been published yet
- Unexpected Results: Developers may see changes that aren't visible to users
| Request Type | Namespace |
|---|---|
RetrieveAllEntitiesRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveAllOptionSetsRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveAttributeRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveEntityRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveOptionSetRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveRelationshipRequest |
Microsoft.Xrm.Sdk.Messages |
RetrieveEntityKeyRequest |
Microsoft.Xrm.Sdk.Messages |
// Object initializer with RetrieveAsIfPublished = true
var request = new RetrieveEntityRequest
{
MetadataId = entityId,
RetrieveAsIfPublished = true // ⚠️ Performance issue
};
service.Execute(request);
// Assignment after creation
var request2 = new RetrieveAllEntitiesRequest();
request2.RetrieveAsIfPublished = true; // ⚠️ Performance issue// Default behavior (RetrieveAsIfPublished = false)
var request = new RetrieveEntityRequest
{
MetadataId = entityId
// RetrieveAsIfPublished defaults to false - good!
};
service.Execute(request);
// Explicit false (for clarity)
var request2 = new RetrieveAllEntitiesRequest
{
RetrieveAsIfPublished = false
};The only valid use case is when building a metadata editor that needs to show unpublished changes:
// ✅ Valid use case: Metadata editor showing draft changes
public class MetadataEditorService
{
public EntityMetadata GetEntityWithDraftChanges(Guid entityId)
{
// This is intentional - we need unpublished changes
#pragma warning disable DEVKIT1016
var request = new RetrieveEntityRequest
{
MetadataId = entityId,
RetrieveAsIfPublished = true
};
#pragma warning restore DEVKIT1016
return ((RetrieveEntityResponse)service.Execute(request)).EntityMetadata;
}
}If you're building a metadata editor and need unpublished data:
#pragma warning disable DEVKIT1016
var request = new RetrieveEntityRequest { RetrieveAsIfPublished = true };
#pragma warning restore DEVKIT1016Or in .editorconfig:
[*.cs]
dotnet_diagnostic.DEVKIT1016.severity = none| Property | Value |
|---|---|
| Rule ID | DEVKIT1016 |
| Category | DynamicsCrm.DevKit |
| Severity | Warning |
| Enabled by default | Yes |