Part of my confusion was an idea that models would be used to do the migrations. But seems like this is not actually the case.

I was also not clear how many models we need at runtime. I now think the answer is 'one for each version of the database we attempt to run the code against'. The model gets refined according to the requiresmigrationattributes which exist on the entity class, and the currently applied migration, and thereby life should be good.