Understanding the code-first model-first and database-first approaches to domain design