Hi Julian,
*.Update() writes the object to the database. If you don't call that after making changes to an Element, Package, Attribute, Collection, etc, the changes will be lost when the variable goes out of scope.
Collection.Refresh() does the opposite: it rereads the collection's contents from the database, so the Collection object in your code is in sync. It should be called after you've added or deleted objects in a Collection. You don't need to call it if you've only made changes to the objects in the collection -- I think.
With diagrams, you should call Diagram.Update() after modifying the diagram's attributes or its contents.
Those are the key ones. You need to use them, or your changes won't take.
Element etc also have a .Refresh(), but it doesn't do the same thing as Collection.Refresh(). Instead, it updates the GUI. You can typically leave that out, I usually do. If needed, the client will flash a message telling the user to refresh manually, so it tends to take care of itself.
Repository.Advise*Change() tells the EA client to refresh the GUI, if necessary, after you've made changes (to already existing objects) in the database. If it works right, it should advise all currently connected clients but I'm not sure about that.
Project.ReloadProject() reloads the current project, and Repository.RefreshModelView() reloads a package. But, I'm pretty sure, only for the client where the call is issued.
Repository.RefreshOpenDiagrams() and Repository.ReloadDiagram() refresh diagrams if they're open (again, only in the client where the call is issued).
HTH,
/Uffe