
AgeGroup שלה, ומקבוצת גיל מגיעים לכל המתנות ששייכות אליה, בלי לכתוב שאילתה.AgeGroup (בשם AgeGroup) עם get ו-set. מכיוון שמתנה לא חייבת קבוצת גיל, מגדירים אותו nullable.ICollection<Gift> בשם Gifts, עם getter בלבד שמאתחל מיד new HashSet<Gift>(). המערכת תמלא את הקולקשן. HashSet מחזיק כל פריט פעם אחת.virtual: מוסיפים אותו לשני ה-Navigation Properties כדי לאפשר Lazy Loading, כלומר שלא ייטען כל מה שקשור לאובייקט אוטומטית. בלי virtual ניסיון Lazy Loading יקרוס. הנושא יורחב בפרק על אסטרטגיות טעינה.InverseProperty: מעל כל Navigation Property מציינים מי הפרופרטי המקביל בצד השני של הקשר, כדי ש-Entity Framework ידע ששניהם מתארים את אותו קשר.ForeignKey: אפשר לשים אותו מעל ה-Navigation Property ולציין את שם העמודה, אבל הדובר מעדיף לשים אותו מעל AgeGroupID עצמו, כדי שיהיה ברור שהוא מפתח זר שמצביע על האובייקט.Gifts מאותחל, מורידים את ה-set כדי שאף אחד לא ייצור קולקשן חדש.הטקסט המלא של הדקות הראשונות בהרצאה «מאפייני ניווט בין טבלאות Entity Framework Core» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר הבא שאנחנו צריכים להגדיר זה את ה-relationship בין שתי הטבלאות ובין שתי האישויות האלה, מתנה וקבוצת גיל. ה-relationship הזה לא הולך סתם ככה להתבצע בדאטאבייס. למה שאנטיטי פריימורק תייצר איזשהו ריליישן בין שתי הטבלאות האלה? יש פה סך הכל הגדרות של מה זה טבלת age groups ומה זה טבלת
gifts. איפה פה בדיוק כתוב שתשמע אתה צריך לעשות איזשהו ריליישן ביניהם ה-ID שנמצא פה צריך להיות מקושר ל-H Group ID שנמצא פה אז תוכלו להגיד רגע אבל כתבת הנה זה H Group ID בדטאבייס מי אמר שאני בדיוק רוצה את הריליישן אולי זה במקרה שתי עמודות בשתי טבלאות שמכילות את אותו השם אנחנו צריכים משהו קצת יותר עם בשר בשביל שהדטאבייס ייצר את זה אם הייתי בונה
את הדטאבייס הייתי בצורה יזומה הולך ובונה לו ריליישן. אחד הדברים הכי מדהימים שקיימים באנטיטי פריימוורק נקרא Navigation Properties.
Navigation Properties זה קודם כל פרופרטי שקיים בישות, במודל שלנו. בדרך כלל שמים אותם פה בסוף. והפרופרטיז האלה מתארים את הצד השני של הקשר.
עכשיו, בואו רגע נבין מה זה אומר. אם יש לי איזשהו אובייקט שהבאתי מהדאטאבייס שמתאר קבוצת גיל ספציפית. נניח שהבאתי את הקבוצת גיל שמתארת את הבייביז.
ובואו נניח שהבאתי גם מקרה אחר, מתנה. אז אני כרגע סתם יוצר אובייקט, אבל בואו תתארו לעצמכם שלא יצרתי אובייקט חדש, אלא הבאתי אותו מהדאטאבייס.
אנחנו יודעים שבדאטאבייס הולך להיות ריליישן בין שתי הטבלאות, בדיוק מה שאנחנו רואים פה, איזשהו ריליישן. שימו לב שהקשר הזה זה אחד הקשרים הכי נפוצים שקיימים, זה נקרא קשר יחיד לרבים.
מפתח זה יחיד והסימן שלה אינסוף זה רבים. זה אומר שבצד הזה קבוצת גיל קיימת פעם אחת. נניח בייביז קיים פה פעם אחת, לא קיים פה שני בייביז.
אבל כאן יכול להיות הרבה הרבה הרבה מתנות שהן בייביז. אז אם נניח קבוצת גיל היא בייביז, תינוקות, והקוד שלה זה 1, המספר 1 פה מופיע פעם אחת.
אבל כאן יכול להיות מלא מלא מלא מלא רשומות של כל המתנות ששייכות לבייביז שיש להם גם כן מספר 1 ב-H Group ID. זה רבים. מספר אחד, יכול לחזור פה הרבה פעמים.
אם נניח הבאתי h-group שמתאר בייביז, אני ארצה שיהיה לי את האפשרות להגיע לכל הגיפטס ברבים ששייכים לאותו h-group, כי יכלתי לבנות איזושהי שאילתת sql שעושה את זה, שאומרת לי, תן לי בבקשה את כל המתנות ששייכות לקבוצת גיל ספציפית, נניח אחד, בייביז.
שאילתת sql כמובן תביא לי אוסף של כל המתנות ששייכות. לבייביז אז אני יכול לקבל אותם אוטומטית על ידי Navigation Property. זה אחד הדברים הכי מעניינים והכי חשובים ב-Entity Framework.
שימו לב זה לא משהו שקיים לנו כרגע במודל אנחנו רוצים להוסיף את זה. אין לי את זה כמובן אז הוא צועק עליי. הצעד השני זה פה כמה קבוצות גיל יש למתנה.
אמרנו מתנה יש לה קבוצת גיל אחת מתנה מבחינתנו כן לא שייכת לשתי קבוצות גיל שונות. אז אנחנו נרצה שדרך המתנה אנחנו נגיע ל-age group שלה.
ממש ל-object age group, לא רק ל-age group ID שלה. ל-object age group, בסדר? זה הכיוון השני של ה-relation. איך אנחנו בונים את זה? בואו נתחיל עם gift.
למתנה יש קבוצת גיל שאליו המתנה שייכת. הנה אנחנו אפילו רואים כאן את המפתח הזר, זה ה-Foreign Key שלה. אז אנחנו כאן רוצים לבנות את ה-Navigation Properties, שכרגע יש לנו רק אחד כזה, וזה Public.
הסוג שלו זה Age Group. אני אקרא לו Age Group, כי זה הגיוני שלמתנה יש Age Group, יכולתי לקרוא לו בשם אחר. וזה כמובן Property, אז יש לו Get ו-Set, הכל חייב להיות Properties.
בגלל שאמרנו מקודם באפיון שלנו שמתנה לא חייבת שיהיה לה h-group, לדוגמה אם המתנה שייכת לכמה או לכולם. אנחנו יכולים להגדיר נ"ל, אנחנו רואים גם כאן, לכן בואו גם נגדיר שזה אופציונלי, לא חייב שיהיה לי אובייקט h-group, והנה נפטרנו מהבעיה הזאת שהייתה לנו פה.
האמת שנגדיר שזה Navigation Property. עכשיו אנחנו רוצים להגדיר את הצד השני. הצד השני נמצא ב-h-group. h-group שייך להרבה מתנות, או הרבה מתנות מכילות את אותו Age Group.
לכן ה-Navigation Property זה בדיוק הצד השני. אם אני אסתכל עוד פעם על הפרוגרם, ל-Gift יש Age Group אחד, אבל ל-Age Group יש הרבה מתנות, Gifts, שהן שייכות ל-Age Group הזה.
אז אנחנו רוצים לבוא לפה ולבנות Property, והוא Collection. אז מה שמקובל זה iCollection מסוג האובייקט שאליו אנחנו מתארים את ה-Collection, זה כמובן גיפט בודדת ונקרא לו גיפטס ברבים מפני של-H- Group יש הרבה מתנות שהן שייכות ל-H- Group הזה.
בואו נגדיר לו שהוא גט. לרוב אנחנו לא רוצים שמישהו יכניס לפה ערך אז אנחנו רושמים גט ומיד יוצרים קולקשן. המערכת רק תמלא אותו, את הקולקשן. קולקשן מקובל באנטיטי פריימורק לייצר אותו מסוג hash set.
השסט זה קולקשן שאומר כל פריט יכול להיות פה פעם אחת. לא הגיוני שיהיו לי פה שתי מתנות מאותו דבר בדיוק ל-H Group. אז השסט מכיל פריט אחד מכל דבר, אולי אי אפשר לשכפל בו פריטים.
בואו נגדיר שגם זה Navigation Property ויש לנו כרגע קודם כל רק את ה-Properties עצמם שמוגדרים בצורה נכונה. שוב פעם בואו נראה מתנה יש ל-H Group אחד ויחיד.
זה כן יכול להיות גט וסט, זה אופציונלי. אבל ל-H Group יש הרבה מתנות, לכן זה קולקשן. מיד התחלנו את הקולקשן, המערכת תוסיף, תוסיף, תוסיף פריטים לקולקשן הזה.
בגלל שכבר עשינו New Collection, אנחנו לא רוצים שמישהו יעשה עוד פעם שווה New, אז הורדנו את ה-set, וזה רק גטר כזה. עוד דבר שחשוב לציין, כאשר אנחנו בונים אותם, בעל לעשות משהו שנראה טיפה מוזר ונקרא virtual.
Navigation Properties, נכון להוסיף להם את המילה virtual. אז מה זה virtual? אנחנו מכירים את המילה virtual בתור Object Oriented, אם אני בונה לדוגמה פונקציה או מאפיין ואני אומר שבהמשך מישהו הולך לדרוס לי את זה, אז אני רוצה לעשות אותו כמאפיין או פונקציה וירטואליים, ואז אפשר לדרוס אותו עם המילה Override.
אבל כאן זה מציין משהו אחר ל-Entity Framework. מה שזה מציין זה שהמאפיין הזה יכול להיטען בצורה שנקראת Lazy Loading. Lazy Loading אומר שכשאני מביא מידע, אני לא רוצה שאוטומטית הוא יביא לי את כל מה שמשוייך למידע הזה. כלומר, אם אני מביא מתנה, אולי אני לא רוצה שהוא יביא לי את ה-H Group שלה.
או אם אני מביא את ה-H Group מהדאטה בייס, אולי אני לא רוצה שהוא יביא לי את כל המתנות מאותו H Group. הגיוני, אני לא רוצה בהכרח את כל המתנות מה-H Group שמביאים לי H Group. אז יש קונספט שנקרא Lazy Loading, יהיה לנו פרק נפרד על Loading Strategies, זה נקרא אסטרטגיות טעינה של המידע של NTT
Framework, אבל כל מה שזה אומר שאנחנו מאפשרים שזה יטען בצורת Lazy Loading, זה מה שזה אומר. אם אנחנו לא נאפשר את זה, לא יהיה virtual ואנחנו ננסה לבצע lazy loading אז הוא יקרוס.
לכן מאוד חשוב שnavigation properties יוגדרו בעזרת virtual אבל אנחנו נדבר על זה בהרחבה בפרק על אסטרטגיות טעינת מידע של האנטיטי פריימורק.
כרגע אני בונה navigation property הוא virtual. זה עדיין סתם מאפיין שקיים לי וגם זה סתם קולקשן מאפיין שהוא קולקשן שקיים לי.
איפה בדיוק אמרנו לאנטיטי פריימורק שהדבר הזה זה גיפט שבעצם שייך לפוסט, זה מתאר את כל המתנות של אותו h-group או שהדבר הזה מתאר את ה-h-group של מתנה ספציפית, זה סתם מאפיין.
איך אנטיטי פריימורק תדע פשוט לשייך אותם ואם אני ארצה אוטומטית להביא את כל המתנות ששייכות ל-h-group שהיא תמלא את ה-collection הזה או אוטומטית אם אני אני רוצה ש-entity framework תביא את ה-age group של מתנה, היא תמלא את זה?
אני צריך להגיד את זה. ואנחנו אומרים את זה על ידי attributes. וה-attributes שאנחנו אומרים כאן, שימו לב, אני ב"מתנה", ב-gift, מעל ה-age group, זה מי זה ה-navigation property שמקביל אליי מהצד השני, מהצד השני של ה-relation.
זה נקרא inverse property. תכף אני אמלא את המחרוזת הזאת, בואו בינתיים נשים אותה כאן, אולי נזיז את זה ואז יהיה קצת יותר ברור, אחד ליד השני. כאן אני אומר מי זה החבר שלי בצד השני של הריליישן.
אם אני מסתכל על ריליישן כל קשר מחבר בין שני צדדים לרוב בין שתי טבלאות לפעמים יש קשר שמחבר בין עמודה לעמודה אחרת באותה טבלה מאוד נדיר אבל ברוב לרוב לרוב זה בין שתי טבלאות אז מה שאנחנו אומרים פה זה בצד אחד יש לי גיפטס בצד השני אייג' גרופס אז הנביגיישן פרופרטי של זה מתאר את זה והנביגיישן
פרופרטי הזה מתאר את אלה אז כל מה שאנחנו צריכים להגיד לו זה מתאר את גיפטס וזה מתאר את אייג' גרופ ממש איזה navigation properties משויכים אחד לשני אז קודם כל זה סוגר לנו את ההוראה