Skip to content
Clean GraphQL API
Lean Mean Clean Apps

Five templates, one search box. Everything in the docs is in here, including the bits we hoped you'd skim.

Try one of these

Results say which template they came from, so you won't end up reading about Lambda when you wanted GraphQL. Again.

Work with the database

The API keeps its data in a SQLite file called movie-reviews.db. With dotnet run it sits next to the app. In the container it’s at /app/data/movie-reviews.db, on the movie-reviews-data volume, so it survives a restart and a rebuild. Nothing to install, nothing to provision, nothing to forget the password for.

Every time the API starts, it applies any pending Entity Framework Core migrations. If Database:SeedSampleData is true and the database is empty, it also seeds the sample movies, authors and reviews. It’s on in appsettings.local.json and appsettings.docker.json, and off everywhere else, so a deployed copy never starts life full of fake reviews.

The sample data uses a fixed seed, so every machine gets the same 15 authors, the same movies and the same ids. That’s why the examples in these docs can name a movie id and expect it to exist on your laptop too.

Delete movie-reviews.db, or drop the volume:

Terminal window
docker compose down -v

The next start builds a fresh database and seeds it again.

Set ConnectionStrings__MovieReviews. To keep everything in memory, which is what the tests do:

Terminal window
docker run --rm -p 8080:8080 -e DOTNET_ENVIRONMENT=docker \
-e ConnectionStrings__MovieReviews="Data Source=MovieReviews;Mode=Memory;Cache=Shared" \
acme-movies:local

After you change the data model in src/Infrastructure:

Terminal window
dotnet tool install --global dotnet-ef
dotnet ef migrations add AddDirectors --project ./src/Infrastructure --output-dir Databases/MovieReviews/Migrations

The next start applies it.

Everything database-shaped lives in Infrastructure, and every class there is internal. To move to PostgreSQL, SQL Server or anything else, implement the repository interfaces from Application (IMoviesRepository, IAuthorsRepository and IReviewsRepository) against the new store and register them in Infrastructure/DependencyInjection.cs. Application and Presentation don’t need to know it happened. That’s the whole sales pitch of Clean Architecture in one paragraph.