Lead
„Gołe” many‑to‑many to banał, ale „łącznik” z dodatkowymi polami już nie. Zrobimy Student–Subject przez Enrollment (Grade, EnrolledDate) + Razor Pages.
Modele
1
2
3
4
5
6
7
8
9
10
| public class Student { public int Id {get;set;} public string Name {get;set;} = ""; public List<Enrollment> Enrollments {get;set;} = []; }
public class Subject { public int Id {get;set;} public string Title {get;set;} = ""; public List<Enrollment> Enrollments {get;set;} = []; }
public class Enrollment {
public int StudentId {get;set;}
public int SubjectId {get;set;}
public decimal? Grade {get;set;}
public DateTime EnrolledDate {get;set;} = DateTime.UtcNow;
public Student Student {get;set;} = default!;
public Subject Subject {get;set;} = default!;
}
|
Konfiguracja
1
2
3
4
5
| modelBuilder.Entity<Enrollment>().HasKey(e => new { e.StudentId, e.SubjectId });
modelBuilder.Entity<Enrollment>()
.HasOne(e=>e.Student).WithMany(s=>s.Enrollments).HasForeignKey(e=>e.StudentId);
modelBuilder.Entity<Enrollment>()
.HasOne(e=>e.Subject).WithMany(s=>s.Enrollments).HasForeignKey(e=>e.SubjectId);
|
Walidacja i UI
- Grade: zakres 2.0–5.0, krok 0.5.
- Dropdowny Student/Subject, data domyślnie UTC Now.
- Sortowanie po Subject, filtrowanie po Student.
Repo‑ready: dodaj DbInitializer, seedy i stronę /Enrollments/Create z walidacją DataAnnotations.