
DbContext.GiftShopContext, שיורשת מ-DbContext של Entity Framework Core. היא אחראית על הוספה והבאה של מידע.Microsoft.EntityFrameworkCore.SqlServer. מסד נתונים אחר, כמו Oracle או MongoDB, דורש חבילה אחרת.DbContextOptions<GiftShopContext> ומעביר אותו ל-base. בעזרת האפשרויות אפשר להעביר Connection String מבחוץ. המערכת לא מחפשת ב-appsettings.json בעצמה.DbSet<T>, ברבים: DbSet<AgeGroup> AgeGroups ו-DbSet<Gift> Gifts. כל DbSet מייצג טבלה שלמה.OnConfiguring: דורסים את הפונקציה (protected override), והיא נקראת בכל פעם שנוצר Context. בודקים if (!optionsBuilder.IsConfigured). אם ה-Context נוצר בלי אפשרויות (constructor ריק), מפעילים optionsBuilder.UseSqlServer(AppConfig.ConnectionString). אם הועברו אפשרויות, הוא כבר מוגדר ולא עושים כלום.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת Context Class לגישה למסד הנתונים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שבנינו את מחלקות המודלים שמתארות את הטבלאות בדאטאבייס, הדבר הבא שאנחנו צריכים לבנות ב-code first זה מחלקה שנקראת context. המחלקה הזאת אחראית על לבצע פעולות על הדאטאבייס, להוסיף מידע, להביא מידע, דרכה אנחנו ניגשים בעצם לדאטאבייס עצמו, בניגוד למחלקות האלה שרק מתארות את המידע ומאפשרות
לייצר אובייקטים. בואו רגע נסגור את אלה בואו ניפטר מהקוד הזה שרשמנו פה נבנה עוד מחלקה בתוך המודלים למרות שהמחלקה הזאת היא בעצמה לא מודל היא מחזיקה את המודלים בתוכה ונקרא לה gift shop בשם הדאטאבייס context והיא יורשת מחלקה שמתארת לנו context בואו רגע ניפטר פה מכל אלה היא יורשת db-context את זאת מנטיטי פריימורק קור, מה זאת בעצם המחלקה
הזאת? המחלקה אמרנו בעזרתה אנחנו ניגשים לדטאבייס ומבצעים כל מיני פעולות בשביל לבנות אותה אנחנו רוצים איפשהו פה בבנייה לתאר שאנחנו ניגשים ספציפית לדטאבייס sql server אם אני ניגש לדטאבייס אחר אז אני צריך לבנות את הקונטקסט כמובן עם הגישה לדטאבייס האחר בגלל שאני בונה אותו את המערכת הזאת עבור sql server
סרבר, מה שאנחנו רוצים לעשות זה להתקין עוד package manager. בואו נרשום פה install מכף package, נפתח את זה על ידי tab, ויש לנו את Microsoft.entityframeworkcore.sql, סרבר, כי זה הדאטאבייס שאנחנו רוצים להתחבר אליו, אם היה לי פה אורקל אולי היה לי פה גם את הנוגט של אורקל, אם היה לי פה את מונגו די בי, היה לי פה נוגט
אחר שקשור למונגו די בי. בגלל שאני מתחבר ל-SQL Server, בואו נתקין את זה. יש פה איזה פונקציה שאנחנו צריכים אותה, מעולה, בואו נוודא שהוא פה.
הנה אנחנו רואים אותו כאן. איך אנחנו בונים את הדבר הזה? דבר ראשון, מה שאנחנו צריכים להגדיר זה קונסטרקטורים. חשוב שיהיו שני קונסטרקטורים.
C-Tor יוצר לנו קונסטרקטור. הקונסטרקטור הראשון זה קונסטרקטור ריק, שמאפשר לנו לבוא וליצור אובייקט ריק מהקונטקסט הזה.
קונסטרקטור הבא שאנחנו רוצים, אני אעשה פה קופי פייסט, זה בעצם קונסטרקטור שמקבל db.context.options שהוא ג'נרי, שאני אומר לו שהסוג שהוא מטפל בו זה gift.shop.context וזה אובייקט אופצ'ינס.
רגע, פה שאני לא אשכח, אני צריך להעביר אותו לבייס. להעביר אותו לזה. אנחנו יכולים לייצר אובייקט ריק, מהמחלקה הזאת ואז הקונסטרקטור הריק יתבצע.
אנחנו יכולים לייצר אובייקט ולשלוח אליו כבר אובייקט שמתאר כל מיני אופצ'יינס עבור הקונטקסט. איזה אופצ'יינס לדוגמה אנחנו צריכים להגדיר מהקונקשן סטרינג?
הוא לא יודע, המערכת לא יודעת אוטומטית ללכת לאפ סטינגס ולחפש פה קונקשן סטרינג שנקראת gift shop, הוא לא עושה את זה, הוא לא עושה את זה אוטומטית.
אנחנו יכולים לתת לו פה Object Optionss שאומר לו תשמע אני כבר אמרתי לך מה ה-Connection Strings זה נמצא ב-Options אז הוא ידע מה ה-Connection Strings או Object Rack ואז אני צריך בדרך אחרת לתת לו את ה-Connection Strings תכף נראה איך.
חוץ מקונסטרקטורים אנחנו צריכים לתאר את המידע בגלל שהמידע זה Data אז אני הרבה פעמים כותב את ה-Data הראשון כאן. ה-Data שאנחנו מוצאים זה הטבלאות שיש ב-Tatabase יש לנו כרגע ב-Tatabase שתי טבלאות בלבד טבלת הגילאים וטבלת המתנות כל טבלה זה פרופרטי אז אני ארשום פרופ והסוג שלה זה db-set db-set
זה מתאר לי טבלה שלמה טבלה זה קולקשן אז אני אומר לו מה הסוג שלו הסוג שלו זה h-group בצורה כזאת ואני נותן לו את השם של הטבלה שאמורה להיות בדאטאבייס זה נקרא h-groups כי טבלאות הן ברבים בואו נייצר את הקולקשן השני פרופ זה יהיה db-set מסוג גיפט ואז יהיה לי פה הרבה מתנות.
אני אקרא לו גיפטס. זה בעצם מתאר לי את כלל המתנות שיש לי. זה כלל ה-age groups, זה כלל המתנות, יכול להיות שיש לי ארבעה age groups, אוקיי, תינוקות, ילדים, נוער, מבוגרים.
אז כאן יהיה לי קולקשן עם ארבעה פריטים, כי זה מה שיש בדאטאבייס. יכול להיות שיש לי עשרת אלפים מתנות בחנות, אז זה יתאר לי את כלל המתנות. שימו לב, בניגוד לזה שמתאר רק את המתנות ששייכות ל-age גרופ הספציפי הזה, נניח לתינוקות, אם הוא מתאר לי תינוקות, אוקיי? זה לא קשור אחד לשני.
עכשיו, אמרנו לקונטקסט, זה המידע שאתה צריך להביא לי מהדאטאבייס. זה מתאר לך איפה הדאטאבייס, וזה המידע שמתאים לטבלאות האלה. הדבר הבא שאנחנו בונים זה דורסים על ידי Override פונקציה שנקראת On-Configuration.
שימו לב, היא פורטקטד Override, לא מחזירה כלום, היא נקראת On-Configuration. הפונקציה הזאת מופעלת אוטומטית כל פעם שהמערכת יוצרת אובייקט קונטקסט.
ויש לנו פה את השורה הזאת, base.onconfiguration, האמת אני לא כזה צריך אותה, בואו ניפטר ממנה.
הפונקציה הזאת מופעלת כשנוצר לי אובייקט קונטקסט, ויש בה את ה-options builder הזה כמשתנה, ויש לו מאפיין שנקרא isConfigured. זה מאפיין שאומר, תשמע, אני true, כבר יש לי את כל הקונפיגורציה הדרושה, אני יודע איפה הדאטאבייס, אני יודע מה ה-Connection String שלו, אני יודע הכל.
קינפגו לי כבר את האובייקטור. מתי הוא יודע כבר הכל? כשהפעילו את הקונסטרקטור הזה והביאו לו את כל ה-Options הדרושים. אז הוא אומר לי, כן, אדוני, אני כבר, אני יודע הכל, אתה לא צריך להתעסק יותר עם שום דבר.
אם הפעילו את הקונסטרקטור הריק, כמובן שלא הפעילו את הקונסטרקטור שמקבל את כל המידע, ה-database מי הקונקשן סטרינג וכדומה לכן המערכת עדיין לא בוצעה קונפיגורציה עבורה והקונטקסט לא יודע מי הפריטים של הקונפיגוריישן ולכן הדבר הזה יהיה false מה שאנחנו צריכים לעשות זה לבדוק אם זה false בואו נעשה not אם זה false אנחנו רוצים
לתת לו את הקונפיגורציה בעצמנו זאת אומרת אם בהמשך מישהו הולך לייצר