On this page
מערך שיעור: SqlRepository
משך: 2.5 שעות אקדמיות (113 דקות).
מטרת השיעור: הסטודנטים יחוו בפועל את הערך של תבנית ה-DAL — מעבר InMemory→SQL בשינוי מבודד, שיטה-שיטה.
בסוף השיעור הסטודנטים צריכים: לכתוב SqlRepository שמממש IRepository קיים מתודה-אחר-מתודה, להחליף רישום DI, להעביר Connection String ל-appsettings.json, ולהסביר למה Service/Controller לא נוגעים.
דגש קריטי: זהו “רגע השיא” של כל תבנית ה-DAL שנלמדה ביחידה הקודמת — הדגישו את זה מפורשות, לא רק “עוד שיעור”. בנו את ה-Repository מתודה-מתודה, לא כקובץ מוכן אחד — זה מה שהופך את ה-Change Tracking (ל-Update/Delete) לברור, לא רק “עוד שורת קוד”.
מהלך השיעור
| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| פתיחה וחיבור | 5 דקות | חזרה: IRepository |
| בונים SqlRepository מתודה-מתודה | 30 דקות | GetAll→GetById→Add→Update→Delete בנפרד; Update/Delete = Change Tracking (מושג חדש) |
| Connection String → appsettings.json | 15 דקות | קשרו לשיעור הראשון ביחידה הקודמת שכבר הזכיר appsettings.json |
| הדגמה חיה: החלפת DI | 20 דקות | שורה אחת ב-Program.cs, בלי לגעת בשאר |
| ה-Controller חוזר להיות דק | 15 דקות | השוו מול הגרסה “המקוצרת” מהשיעור הקודם שדיברה ישר עם DbContext |
| בדיקת עמידות | 13 דקות | restart אפליקציה, נתונים עדיין קיימים; אותם 2 endpoints כמו בשיעור הקודם |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |
דגשים להעברת השיעור
- זהו רגע ה"וואו" של כל היחידה — ודאו שסטודנטים באמת רואים בפועל ששינוי שורה אחת ב-
Program.csהוא כל מה שנדרש. אל תדלגו על ההדגמה החיה הזו לטובת תיאור. - הדגישו שהבדיקה “restart אפליקציה, נתונים עדיין שם” היא ההוכחה האמיתית להבדל בין InMemory ל-SQL — לא רק תיאורטית, אלא ניתנת-לבדיקה בפועל.
- SaveChanges בכל מתודה (לא רק Add) הוא מלכודת נפוצה — הדגימו Delete בלי SaveChanges שנכשל “בשקט”.
מושגים
SqlRepository — מימוש IRepository<T> עם EF Core.
Change Tracking — איך DbContext יודע אם לייצר INSERT/UPDATE/DELETE כש-SaveChanges נקרא.
appsettings.json — קובץ הגדרות הפרויקט; כאן נטען ממנו Connection String בפועל לראשונה.
Connection String — הגדרת חיבור ל-DB, מ-Configuration (לא מקושח בקוד).
תרגיל חשיבה
שאלת פתיחה: “לפני שהתחלתם את היחידה הזו, האם חשבתם שמעבר ממאגר-נתונים-בזיכרון למסד-נתונים-אמיתי ידרוש לשכתב את כל ה-Controller וה-Service? מה השתנה בהבנה שלכם?”
מהלך: תנו לסטודנטים לחשוב אחורה על מה שהיו מצפים “לפני” מול מה שקרה בפועל “אחרי”. זו הזדמנות מצוינת לגבש בקול רם את הלקח המרכזי של כל שתי היחידות (ASP.NET Core + SQL/EF Core) יחד: תכנון נכון מראש (DIP, IRepository) הופך שינויים גדולים-לכאורה לשינויים קטנים בפועל.
מה המרצה מראה בסוף: הראו side-by-side את InMemoryStudentRepository ו-SqlStudentRepository — שני קבצים נפרדים לגמרי, אותו Interface בדיוק. הריצו את אותה קריאת API (GET api/students) פעם מול כל מימוש (על ידי שינוי הרישום ב-Program.cs והרצה מחדש) — התוצאה זהה מבחוץ, ההבדל רק “מאחורי הקלעים”.