Build a Task Manager Console App in C#

Build a Task Manager Console App in C#

Build a Task Manager Console App in C#

A practical console application that demonstrates C# fundamentals alongside Entity Framework Core for data persistence.

Features

  • Add, list, complete, and delete tasks
  • SQLite database via Entity Framework Core
  • Dependency injection with the generic host
  • Colorized console output
  • Filter tasks by status

Step 1 — Project Setup

dotnet new console -n TaskManager
cd TaskManager
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.Extensions.Hosting

Step 2 — Model and DbContext

public class TaskItem
{
    public int     Id          { get; set; }
    public string  Title       { get; set; } = string.Empty;
    public bool    IsCompleted { get; set; }
    public DateTime CreatedAt  { get; set; } = DateTime.UtcNow;
}

public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
    public DbSet<TaskItem> Tasks => Set<TaskItem>();
}

Step 3 — Task Service

public class TaskService(AppDbContext db)
{
    public async Task AddAsync(string title)
    {
        db.Tasks.Add(new TaskItem { Title = title });
        await db.SaveChangesAsync();
    }

    public async Task<List<TaskItem>> GetAllAsync(bool? completed = null)
    {
        return await db.Tasks
            .Where(t => completed == null || t.IsCompleted == completed)
            .OrderBy(t => t.CreatedAt)
            .ToListAsync();
    }

    public async Task CompleteAsync(int id)
    {
        var task = await db.Tasks.FindAsync(id)
            ?? throw new InvalidOperationException($"Task {id} not found");
        task.IsCompleted = true;
        await db.SaveChangesAsync();
    }

    public async Task DeleteAsync(int id)
    {
        var task = await db.Tasks.FindAsync(id)
            ?? throw new InvalidOperationException($"Task {id} not found");
        db.Tasks.Remove(task);
        await db.SaveChangesAsync();
    }
}

Step 4 — CLI Loop

while (true)
{
    Console.WriteLine("\n[1] List  [2] Add  [3] Complete  [4] Delete  [0] Exit");
    var choice = Console.ReadLine();

    switch (choice)
    {
        case "1":
            var tasks = await service.GetAllAsync();
            foreach (var t in tasks)
            {
                var status = t.IsCompleted ? "✓" : "○";
                Console.WriteLine($"  [{t.Id}] {status} {t.Title}");
            }
            break;
        case "2":
            Console.Write("Title: ");
            var title = Console.ReadLine()!;
            await service.AddAsync(title);
            break;
        case "0":
            return;
    }
}
All Comments