source: iknow-api/Data/AppDbContext.cs@ aee2b88

Last change on this file since aee2b88 was aee2b88, checked in by Stefan-Saveski <stefansaveski19@…>, 9 months ago

Upgraded database, added get subjects and get passed subjects.

  • Property mode set to 100644
File size: 7.8 KB
Line 
1using Microsoft.EntityFrameworkCore;
2using iknow_api.Models;
3
4namespace iknow_api.Data
5{
6 public class AppDbContext : DbContext
7 {
8 public AppDbContext(DbContextOptions<AppDbContext> options)
9 : base(options) { }
10
11 public DbSet<User> User { get; set; }
12 public DbSet<ContactInfo> ContactInfo { get; set; }
13 public DbSet<HighSchool> HighSchool { get; set; }
14 public DbSet<EnrollmentInfo> EnrollmentInfo { get; set; }
15 public DbSet<RefreshToken> RefreshToken { get; set; }
16 public DbSet<Subject> Subjects { get; set; }
17 public DbSet<DependencySubject> DependencySubjects { get; set; }
18 public DbSet<Major> Majors { get; set; }
19 public DbSet<PassedSubject> PassedSubjects { get; set; }
20 public DbSet<EnrolledSemesters> EnrolledSemesters { get; set; }
21 public DbSet<ActiveSemesters> ActiveSemesters { get; set; }
22 public DbSet<SemesterSubject> SemesterSubjects { get; set; }
23 public DbSet<MajorSubjects> MajorSubjects { get; set; }
24 public DbSet<UserDocuments> UserDocuments { get; set; }
25 public DbSet<Documents> Documents { get; set; }
26 public DbSet<Payment> Payments { get; set; }
27 public DbSet<ProfessorSubjects> ProfessorSubjects { get; set; }
28
29
30 protected override void OnModelCreating(ModelBuilder modelBuilder)
31 {
32 base.OnModelCreating(modelBuilder);
33
34 modelBuilder.Entity<Major>().HasData(
35 new Major { Id = 1, Name = "PIT" },
36 new Major { Id = 2, Name = "SIIS" },
37 new Major { Id = 3, Name = "SEIS" },
38 new Major { Id = 4, Name = "KN" }
39 );
40
41
42 // -------------------------
43 // DependencySubject (self-referencing many-to-many)
44 // -------------------------
45 modelBuilder.Entity<DependencySubject>()
46 .HasKey(ds => new { ds.SubjectId, ds.DependencyId });
47
48 modelBuilder.Entity<DependencySubject>()
49 .HasOne(ds => ds.Subject)
50 .WithMany(s => s.Dependencies)
51 .HasForeignKey(ds => ds.SubjectId)
52 .OnDelete(DeleteBehavior.Restrict);
53
54 modelBuilder.Entity<DependencySubject>()
55 .HasOne(ds => ds.Dependency)
56 .WithMany(s => s.Dependents)
57 .HasForeignKey(ds => ds.DependencyId)
58 .OnDelete(DeleteBehavior.Restrict);
59
60 // -------------------------
61 // MajorSubjects (many-to-many)
62 // -------------------------
63 modelBuilder.Entity<MajorSubjects>()
64 .HasKey(ab => new { ab.MajorId, ab.SubjectId });
65
66 modelBuilder.Entity<MajorSubjects>()
67 .HasOne(ab => ab.Majors)
68 .WithMany(a => a.Subjects)
69 .HasForeignKey(ab => ab.MajorId)
70 .OnDelete(DeleteBehavior.Cascade);
71
72 modelBuilder.Entity<MajorSubjects>()
73 .HasOne(ab => ab.Subjects)
74 .WithMany(b => b.Majors)
75 .HasForeignKey(ab => ab.SubjectId)
76 .OnDelete(DeleteBehavior.Cascade);
77
78 // -------------------------
79 // UserDocuments (many-to-many)
80 // -------------------------
81 modelBuilder.Entity<UserDocuments>()
82 .HasKey(ab => new { ab.UserId, ab.DocumentId });
83
84 modelBuilder.Entity<UserDocuments>()
85 .HasOne(ab => ab.User)
86 .WithMany(a => a.Documents)
87 .HasForeignKey(ab => ab.UserId)
88 .OnDelete(DeleteBehavior.Cascade);
89
90 modelBuilder.Entity<UserDocuments>()
91 .HasOne(ab => ab.Documents)
92 .WithMany(b => b.User)
93 .HasForeignKey(ab => ab.DocumentId)
94 .OnDelete(DeleteBehavior.Cascade);
95
96 // -------------------------
97 // Payment (user enrollment)
98 // -------------------------
99 modelBuilder.Entity<Payment>()
100 .HasKey(p => p.Id);
101
102 modelBuilder.Entity<Payment>()
103 .HasOne(p => p.User)
104 .WithMany(u => u.EnrolledSemesters)
105 .HasForeignKey(p => p.UserId)
106 .OnDelete(DeleteBehavior.Cascade);
107
108 modelBuilder.Entity<Payment>()
109 .HasOne(p => p.EnrolledSemesters)
110 .WithMany(es => es.Users)
111 .HasForeignKey(p => p.EnrollmentInfoId)
112 .OnDelete(DeleteBehavior.Cascade);
113
114 // -------------------------
115 // SemesterSubject (student enrollments and professor assignments)
116 // -------------------------
117 modelBuilder.Entity<SemesterSubject>()
118 .HasKey(ss => ss.Id); // or composite key if you prefer {UserId, EnrolledSemesterId, SubjectId}
119
120 // Student enrollment
121 modelBuilder.Entity<SemesterSubject>()
122 .HasOne(ss => ss.User)
123 .WithMany(u => u.EnrolledSemesterUserSubjects)
124 .HasForeignKey(ss => ss.UserId)
125 .OnDelete(DeleteBehavior.Restrict);
126
127 // Professor teaching
128 modelBuilder.Entity<SemesterSubject>()
129 .HasOne(ss => ss.Professor)
130 .WithMany(u => u.TeachingSubjects)
131 .HasForeignKey(ss => ss.ProfessorId)
132 .OnDelete(DeleteBehavior.Restrict);
133
134 // Subject relation
135 modelBuilder.Entity<SemesterSubject>()
136 .HasOne(ss => ss.Subject)
137 .WithMany(s => s.SemesterSubjects)
138 .HasForeignKey(ss => ss.SubjectId)
139 .OnDelete(DeleteBehavior.Restrict);
140
141 // EnrolledSemester relation
142 modelBuilder.Entity<SemesterSubject>()
143 .HasOne(ss => ss.EnrolledSemester)
144 .WithMany(es => es.SemesterSubjects)
145 .HasForeignKey(ss => ss.EnrolledSemesterId)
146 .OnDelete(DeleteBehavior.Restrict);
147
148 // -------------------------
149 // PassedSubject (one-to-one with SemesterSubject)
150 // -------------------------
151 modelBuilder.Entity<PassedSubject>()
152 .HasKey(ps => ps.Id);
153
154 modelBuilder.Entity<PassedSubject>()
155 .HasOne(ps => ps.SemesterSubject)
156 .WithOne(ss => ss.PassedSubject)
157 .HasForeignKey<PassedSubject>(ps => ps.SemesterSubjectId)
158 .OnDelete(DeleteBehavior.Cascade);
159
160 // -------------------------
161 // ActiveSemesters to EnrolledSemesters (one-to-many)
162 // -------------------------
163 modelBuilder.Entity<EnrolledSemesters>()
164 .HasOne(es => es.Semester)
165 .WithMany(a => a.EnrolledSemesters)
166 .HasForeignKey(es => es.Id)
167 .OnDelete(DeleteBehavior.Restrict);
168
169 // -------------------------
170 // ProfessorSubjects (many-to-many: Professor -> Semester -> Subject)
171 // -------------------------
172 modelBuilder.Entity<ProfessorSubjects>()
173 .HasKey(ps => new { ps.ProfessorId, ps.SemesterId, ps.SubjectId });
174
175 modelBuilder.Entity<ProfessorSubjects>()
176 .HasOne(ps => ps.Professor)
177 .WithMany()
178 .HasForeignKey(ps => ps.ProfessorId)
179 .OnDelete(DeleteBehavior.Cascade);
180
181 modelBuilder.Entity<ProfessorSubjects>()
182 .HasOne(ps => ps.Semester)
183 .WithMany()
184 .HasForeignKey(ps => ps.SemesterId)
185 .OnDelete(DeleteBehavior.Cascade);
186
187 modelBuilder.Entity<ProfessorSubjects>()
188 .HasOne(ps => ps.Subject)
189 .WithMany()
190 .HasForeignKey(ps => ps.SubjectId)
191 .OnDelete(DeleteBehavior.Cascade);
192 }
193
194 }
195}
Note: See TracBrowser for help on using the repository browser.