Essential session storage is required to sign in. Optional analytics remain off unless you allow them.
Build a small REST API in ASP.NET Core (Minimal APIs or controllers) for a simple domain (e.g. a todo or bookmark service). Use EF Core with a DbContext + code-first migrations to persist data to a database, model binding to read requests, and data-annotation validation (with the [ApiController] auto-400 or explicit ModelState checks) returning ProblemDetails on bad input. Register services via the built-in DI with appropriate lifetimes (e.g. the DbContext as Scoped). Use async/await for all I/O (no .Result/.Wait()). Expose CRUD endpoints with correct HTTP status codes.
Working CRUD with EF Core (DbContext/DbSet, migrations); correct HTTP verbs/status codes; DbContext registered Scoped.
Model binding + validation returns ProblemDetails / 400 on bad input; the happy path is type-safe.
All I/O is async/await; nothing blocks on async (no .Result/.Wait()).
Clean DI registration; idiomatic modern ASP.NET Core (Program.cs/WebApplication).
Use this README structure to make the work reviewable.
DevPath fetches a read-only, size-capped snapshot. Submitted code is never executed.
# A REST API with EF Core and validation ## Goal Build a small REST API in ASP.NET Core (Minimal APIs or controllers) for a simple domain (e.g. a todo or bookmark service). Use EF Core with a DbContext + code-first migrations to persist data to a database, model binding to read requests, and data-annotation validation (with the [ApiController] auto-400 or explicit ModelState checks) returning ProblemDetails on bad input. Register services via the built-in DI with appropriate lifetimes (e.g. the DbContext as Scoped). Use async/await for all I/O (no .Result/.Wait()). Expose CRUD endpoints with correct HTTP status codes. ## Acceptance criteria - [ ] CRUD + EF Core: Working CRUD with EF Core (DbContext/DbSet, migrations); correct HTTP verbs/status codes; DbContext registered Scoped. - [ ] Validation: Model binding + validation returns ProblemDetails / 400 on bad input; the happy path is type-safe. - [ ] Async correctness: All I/O is async/await; nothing blocks on async (no .Result/.Wait()). - [ ] Structure: Clean DI registration; idiomatic modern ASP.NET Core (Program.cs/WebApplication). ## Verification - [ ] Document installation and run commands. - [ ] Record automated checks and their exact commands. - [ ] Add representative output, screenshots, or a short demo where useful. - [ ] Confirm failure paths and known constraints. ## Decision log ### Decision title - Context: - Choice: - Alternatives considered: - Tradeoffs: ## Evidence - Link each rubric criterion to the file, test, or artifact that demonstrates it. ## Known limitations - List what is intentionally out of scope and what should be improved next.