# מערך שיעור: SqlRepository📋 מערך מרצה

משך: 2.5 שעות אקדמיות (113 דקות).

מטרת השיעור: הסטודנטים יחוו בפועל את הערך של תבנית ה-DAL — מעבר InMemory→SQL בשינוי מבודד, שיטה-שיטה.

בסוף השיעור הסטודנטים צריכים: לכתוב SqlRepository שמממש IRepository קיים מתודה-אחר-מתודה, להחליף רישום DI, להעביר Connection String ל-appsettings.json, ולהסביר למה Service/Controller לא נוגעים.

דגש קריטי: זהו "רגע השיא" של כל תבנית ה-DAL שנלמדה ביחידה הקודמת — הדגישו את זה מפורשות, לא רק "עוד שיעור". בנו את ה-Repository מתודה-מתודה, לא כקובץ מוכן אחד — זה מה שהופך את ה-Change Tracking (ל-Update/Delete) לברור, לא רק "עוד שורת קוד".

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | חזרה: IRepository<Student> + InMemoryStudentRepository מהיחידה הקודמת |
| בונים 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` והרצה מחדש) — התוצאה זהה מבחוץ, ההבדל רק "מאחורי הקלעים".
