Pre save
•Validating whether certain values have been specified (Use the Validation framework)
•Validating whether certain combinations of values are allowed (Use the Validation framework)
•Setting entity field values (if you want to initialize field values then override OnInitializing or OnInitialized, if you want to set values before persisting the entity then override OnBeforeEntitySave in a partial class of the specific entity, or of the CommonEntityBase, if the logic is common for all or some entities)
•Checking whether certain items already exists in a table (It's not clear what are you checking, is it about concurrency? are you checking if an entity with the same PK exists? or an entity with similar data? or checking about some other data in another table?
In most of the cases (except for concurrency checks, I believe this falls into the application business logic, and maybe a Fetch is needed to check on what you want, before you attempt the save)
Post save
•Updating timestamps (Isn't this automatically maintained by the database (timestamp/rowversion), or are you speaking about something else?, please clarify.)
•Invalidating a cache (OnSaveComplete)
•Creating related entities that should be there by default (I'd consider this a pre-save action, where you use OnBeforeEntitySave to add those related entities to the entity being saved, and make sure the save is recursive)
Pre delete
•Checking whether an item can be deleted. (How would the actual check be upon?, is this a check on dependent related entities existence which are on the FK side. This is very tricky, and the question comes down to, do you want the entity marked "undeletable" so the user wouldn't be able to delete it, in this case no Pre-Delete event would be available, coz there is no delete has been attempted. If you want the user to attempt to delete the entity, then you want to visit the database to check on certain conditions if not valid, you'd go back to notify the user that the delete can not be performed, otherwise the delete would be executed, in this case wouldn't a direct execute of the delete be more efficient to save the first database hit, and if it's not deleted you'd get an exception that you can handle and notify the user accordingly.)
Post delete
•Updating timestamps (Not sure which timestamps to update, please clarify)
•Invalidating a cache (Seems to me a business logic action, that better be handled on higher layers of the application).