Skip to content

EF - Exercise 1

  • Create a new Dotnet Console Application.
  • Create a folder Entities and add the following classes.
public class Student
{
public Student() {}
public Student(string name)
{
Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
public List<CourseEnrollment> CourseEnrollments { get; set; }
}
public class Course
{
public Course() {}
public Course(string courseName)
{
CourseName = courseName;
}
public int Id { get; set; }
public string CourseName { get; set; }
}
public class CourseEnrollment
{
public CourseEnrollment() {}
public CourseEnrollment(Student student, Course course, string enrollmentPeriod)
{
Student = student;
Course = course;
EnrollmentPeriod = enrollmentPeriod;
}
public int StudentId { get; set; }
public Student Student { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
public int? Grade { get; set; }
public string EnrollmentPeriod { get; set; }
}
  • Create a database context named SchoolContext
  • Define a composite primary key on the m:n table by overriding this method in your context:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<CourseEnrollment>()
.HasKey(o => new { o.StudentId, o.CourseId, o.EnrollmentPeriod });
}
  • Make sure you have installed all required NuGet packages to connect to your database.
  • Create a database migration and apply it to the database.
  • Use this Program.cs file and implement the missing functionality.
public static class Program
{
public static async Task Main(string[] args)
{
await SetupTestData();
await UpdateGrades();
await Query1();
await Query2();
await Query3();
await Query4();
await CeanupOldData();
}
private static async Task SetupTestData()
{
Console.Write("Setting up test data ... ");
await using var context = new SchoolContext();
if (await context.Students.AnyAsync())
{
Console.WriteLine("SKIPPED");
return;
}
var students = new List<Student>()
{
new Student("Fritz"),
new Student("Ellie"),
new Student("Ferdl"),
new Student("Lisa")
};
var courses = new List<Course>()
{
new Course("Software Entwicklung 4"),
new Course("Datenbanken 4"),
new Course("Verteilte Systeme 5"),
new Course("Programming in COBOL 1")
};
var enrollments = new List<CourseEnrollment>()
{
new CourseEnrollment(students[0], courses[0], "2023/24"),
new CourseEnrollment(students[1], courses[0], "2023/24"),
new CourseEnrollment(students[2], courses[0], "2023/24"),
new CourseEnrollment(students[3], courses[0], "2023/24"),
new CourseEnrollment(students[0], courses[1], "2023/24"),
new CourseEnrollment(students[1], courses[1], "2023/24"),
new CourseEnrollment(students[2], courses[1], "2023/24"),
new CourseEnrollment(students[3], courses[1], "2023/24"),
new CourseEnrollment(students[1], courses[2], "2023/24"),
new CourseEnrollment(students[0], courses[3], "1992/93")
};
await context.Students.AddRangeAsync(students);
await context.Courses.AddRangeAsync(courses);
await context.CourseEnrollments.AddRangeAsync(enrollments);
await context.SaveChangesAsync();
Console.WriteLine("DONE");
}
private static async Task UpdateGrades()
{
Console.Write("Setting grades ... ");
// TODO: update existing CourseEnrollments, setting some grades.
// TODO: give at least one 1, one 5, and leave at least one grade NULL
Console.WriteLine("DONE");
}
private static async Task Query1()
{
Console.WriteLine("List all students that have at least one 5 as a grade ...");
// TODO
Console.WriteLine("DONE");
}
private static async Task Query2()
{
Console.WriteLine("List the average grade for each student ...");
// TODO
Console.WriteLine("DONE");
}
private static async Task Query3()
{
Console.WriteLine("List the minimum and maximum grade for each course ...");
// TODO
Console.WriteLine("DONE");
}
private static async Task Query4()
{
Console.WriteLine("List all students where a grade has not been given yet");
// TODO: output should be like:
// student 1
// course with missing grade 1
// course with missing grade 2
// ...
// student 2
// course with missing grade 1
// ...
Console.WriteLine("DONE");
}
private static async Task CeanupOldData()
{
Console.WriteLine("Delete COBOL Programming course and every course enrollment linked to it.");
// TODO
Console.WriteLine("DONE");
}
}