How does the Dataverse event framework work, and when should developers use PreEntityImages and PostEntityImages in a plug-in?
Question
Answers
The Dataverse event framework is fundamental to building reliable server-side business logic in Dynamics 365 CE. A plug-in isn't simply "code that runs when a record changes"—it participates in the Dataverse execution pipeline, where the stage, message, entity, filtering attributes, execution mode, and transaction context all influence behavior.
The major execution stages are typically:
PreValidation → PreOperation → Main Operation → PostOperation
Developers need to understand what data is available and what can safely be changed at each stage.
One of the most important concepts is the Entity Image.
PreEntityImage
A Pre Image represents the record's values before the operation.
For example, suppose an Account's credit limit changes from:
₹500,000 → ₹1,000,000
A plug-in registered on Update may need to compare the old and new values.
Instead of retrieving the Account again from Dataverse, the plug-in can use:
PreEntityImages["Image"]
This is particularly useful for:
- Comparing old vs new values
- Detecting meaningful field changes
- Applying conditional business rules
- Avoiding unnecessary Retrieve operations
PostEntityImage
A Post Image represents the entity state after the operation, within the context where the image is available.
This becomes useful when downstream logic needs to evaluate the resulting state of the record.
For example:
"After an Opportunity becomes Won, evaluate the final values and create/update a related record."
The architectural consideration
Don't register every attribute in every image.
Images should contain only the columns your plug-in actually requires.
Otherwise, you increase the amount of data passed into the plug-in and make the registration unnecessarily broad.
Also remember that an Update request's Target entity may contain only changed attributes, not the complete entity.
That distinction is critical.
A common production bug is writing:
target["creditlimit"]
and assuming the attribute will always exist.
A robust plug-in should understand the difference between:
Target = submitted changes
Pre Image = previous state
Post Image = resulting state
This becomes even more important when designing PreOperation validation, transactional logic, recursion prevention, filtering attributes and plug-in performance.
If you're progressing from basic Dynamics 365 customization into professional CE development, mastering the event framework is one of the areas that separates a configuration-level developer from an enterprise Dynamics developer.