A practical console application that demonstrates C# fundamentals alongside Entity Framework Core for data persistence.
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
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>();
}
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();
}
}
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