PracticU

מאפייני ניווט בין טבלאות
Entity Framework Core

בלי כתוביותעם כתוביות
PracticU › קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט › מאפייני ניווט בין טבלאות Entity Framework Core
מילון מושגים:
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
Entity Framework - ספריית מיקרוסופט שממפה בין אובייקטים בקוד לבין טבלאות במסד נתונים, ומאפשרת לעבוד עם הנתונים בלי לכתוב SQL ישיר.
פריימוורק - מסגרת תוכנה שמספקת מבנה וכלים מוכנים לפיתוח יישומים, כדי לחסוך כתיבת קוד חוזר.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
מפתח זר - עמודה בטבלה שמפנה למפתח הראשי בטבלה אחרת, ובכך יוצרת קשר בין הטבלאות.

מאפייני ניווט בין טבלאות Entity Framework Core
כדי ש-Entity Framework תיצור קשר בין שתי טבלאות לא מספיק ששתי עמודות נושאות את אותו שם. ההרצאה מגדירה Navigation Properties בין Gift ל-AgeGroup, כדי שהקשר ייוצר בדאטאבייס וגם יהיה נוח לעבודה בקוד.
השלבים העיקריים
1. הקשר: יחיד לרבים. קבוצת גיל כמו Babies קיימת פעם אחת, אבל הרבה מתנות יכולות להשתייך אליה.
2. מה זה Navigation Property: פרופרטי במודל שמתאר את הצד השני של הקשר. ממתנה מגיעים ישר לאובייקט AgeGroup שלה, ומקבוצת גיל מגיעים לכל המתנות ששייכות אליה, בלי לכתוב שאילתה.
3. בצד של Gift: פרופרטי מסוג AgeGroup (בשם AgeGroup) עם get ו-set. מכיוון שמתנה לא חייבת קבוצת גיל, מגדירים אותו nullable.
4. בצד של AgeGroup: פרופרטי מסוג ICollection<Gift> בשם Gifts, עם getter בלבד שמאתחל מיד new HashSet<Gift>(). המערכת תמלא את הקולקשן. HashSet מחזיק כל פריט פעם אחת.
5. virtual: מוסיפים אותו לשני ה-Navigation Properties כדי לאפשר Lazy Loading, כלומר שלא ייטען כל מה שקשור לאובייקט אוטומטית. בלי virtual ניסיון Lazy Loading יקרוס. הנושא יורחב בפרק על אסטרטגיות טעינה.
6. InverseProperty: מעל כל Navigation Property מציינים מי הפרופרטי המקביל בצד השני של הקשר, כדי ש-Entity Framework ידע ששניהם מתארים את אותו קשר.
7. ForeignKey: אפשר לשים אותו מעל ה-Navigation Property ולציין את שם העמודה, אבל הדובר מעדיף לשים אותו מעל AgeGroupID עצמו, כדי שיהיה ברור שהוא מפתח זר שמצביע על האובייקט.
שימו לב
- בגלל ש-Gifts מאותחל, מורידים את ה-set כדי שאף אחד לא ייצור קולקשן חדש.
- אחרי ההגדרות האלה Entity Framework יוצר את המפתח הזר בדאטאבייס.
אחרי ההרצאה תוכלו להגדיר קשר יחיד לרבים בין שני מודלים עם Navigation Properties, מפתח זר ו-InverseProperty.
השיעור הבא בקורס: יצירת Context Class לגישה למסד הנתונים

פרקי ההרצאה: מאפייני ניווט בין טבלאות Entity Framework Core

  1. 00:00

    ה-Relationship בין הטבלאות

  2. 00:59

    מהם Navigation Properties

  3. 01:36

    קשר יחיד לרבים

  4. 03:09

    הוספת Navigation Property למתנה

  5. 04:48

    בניית Collection בצד קבוצת הגיל

  6. 06:43

    המילה virtual ו-Lazy Loading

  7. 08:31

    קישור הצדדים עם Inverse Property

  8. 09:42

    שיוך ה-Navigation Properties

תמלול ההרצאה: מאפייני ניווט בין טבלאות Entity Framework Core

הטקסט המלא של הדקות הראשונות בהרצאה «מאפייני ניווט בין טבלאות Entity Framework Core» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    הדבר הבא שאנחנו צריכים להגדיר זה את ה-relationship בין שתי הטבלאות ובין שתי האישויות האלה, מתנה וקבוצת גיל. ה-relationship הזה לא הולך סתם ככה להתבצע בדאטאבייס. למה שאנטיטי פריימורק תייצר איזשהו ריליישן בין שתי הטבלאות האלה? יש פה סך הכל הגדרות של מה זה טבלת age groups ומה זה טבלת

  2. 00:29

    gifts. איפה פה בדיוק כתוב שתשמע אתה צריך לעשות איזשהו ריליישן ביניהם ה-ID שנמצא פה צריך להיות מקושר ל-H Group ID שנמצא פה אז תוכלו להגיד רגע אבל כתבת הנה זה H Group ID בדטאבייס מי אמר שאני בדיוק רוצה את הריליישן אולי זה במקרה שתי עמודות בשתי טבלאות שמכילות את אותו השם אנחנו צריכים משהו קצת יותר עם בשר בשביל שהדטאבייס ייצר את זה אם הייתי בונה

  3. 00:57

    את הדטאבייס הייתי בצורה יזומה הולך ובונה לו ריליישן. אחד הדברים הכי מדהימים שקיימים באנטיטי פריימוורק נקרא Navigation Properties.

  4. 01:07

    Navigation Properties זה קודם כל פרופרטי שקיים בישות, במודל שלנו. בדרך כלל שמים אותם פה בסוף. והפרופרטיז האלה מתארים את הצד השני של הקשר.

  5. 01:19

    עכשיו, בואו רגע נבין מה זה אומר. אם יש לי איזשהו אובייקט שהבאתי מהדאטאבייס שמתאר קבוצת גיל ספציפית. נניח שהבאתי את הקבוצת גיל שמתארת את הבייביז.

  6. 01:32

    ובואו נניח שהבאתי גם מקרה אחר, מתנה. אז אני כרגע סתם יוצר אובייקט, אבל בואו תתארו לעצמכם שלא יצרתי אובייקט חדש, אלא הבאתי אותו מהדאטאבייס.

  7. 01:44

    אנחנו יודעים שבדאטאבייס הולך להיות ריליישן בין שתי הטבלאות, בדיוק מה שאנחנו רואים פה, איזשהו ריליישן. שימו לב שהקשר הזה זה אחד הקשרים הכי נפוצים שקיימים, זה נקרא קשר יחיד לרבים.

  8. 01:57

    מפתח זה יחיד והסימן שלה אינסוף זה רבים. זה אומר שבצד הזה קבוצת גיל קיימת פעם אחת. נניח בייביז קיים פה פעם אחת, לא קיים פה שני בייביז.

  9. 02:06

    אבל כאן יכול להיות הרבה הרבה הרבה מתנות שהן בייביז. אז אם נניח קבוצת גיל היא בייביז, תינוקות, והקוד שלה זה 1, המספר 1 פה מופיע פעם אחת.

  10. 02:17

    אבל כאן יכול להיות מלא מלא מלא מלא רשומות של כל המתנות ששייכות לבייביז שיש להם גם כן מספר 1 ב-H Group ID. זה רבים. מספר אחד, יכול לחזור פה הרבה פעמים.

  11. 02:27

    אם נניח הבאתי h-group שמתאר בייביז, אני ארצה שיהיה לי את האפשרות להגיע לכל הגיפטס ברבים ששייכים לאותו h-group, כי יכלתי לבנות איזושהי שאילתת sql שעושה את זה, שאומרת לי, תן לי בבקשה את כל המתנות ששייכות לקבוצת גיל ספציפית, נניח אחד, בייביז.

  12. 02:52

    שאילתת sql כמובן תביא לי אוסף של כל המתנות ששייכות. לבייביז אז אני יכול לקבל אותם אוטומטית על ידי Navigation Property. זה אחד הדברים הכי מעניינים והכי חשובים ב-Entity Framework.

  13. 03:07

    שימו לב זה לא משהו שקיים לנו כרגע במודל אנחנו רוצים להוסיף את זה. אין לי את זה כמובן אז הוא צועק עליי. הצעד השני זה פה כמה קבוצות גיל יש למתנה.

  14. 03:18

    אמרנו מתנה יש לה קבוצת גיל אחת מתנה מבחינתנו כן לא שייכת לשתי קבוצות גיל שונות. אז אנחנו נרצה שדרך המתנה אנחנו נגיע ל-age group שלה.

  15. 03:32

    ממש ל-object age group, לא רק ל-age group ID שלה. ל-object age group, בסדר? זה הכיוון השני של ה-relation. איך אנחנו בונים את זה? בואו נתחיל עם gift.

  16. 03:47

    למתנה יש קבוצת גיל שאליו המתנה שייכת. הנה אנחנו אפילו רואים כאן את המפתח הזר, זה ה-Foreign Key שלה. אז אנחנו כאן רוצים לבנות את ה-Navigation Properties, שכרגע יש לנו רק אחד כזה, וזה Public.

  17. 04:06

    הסוג שלו זה Age Group. אני אקרא לו Age Group, כי זה הגיוני שלמתנה יש Age Group, יכולתי לקרוא לו בשם אחר. וזה כמובן Property, אז יש לו Get ו-Set, הכל חייב להיות Properties.

  18. 04:20

    בגלל שאמרנו מקודם באפיון שלנו שמתנה לא חייבת שיהיה לה h-group, לדוגמה אם המתנה שייכת לכמה או לכולם. אנחנו יכולים להגדיר נ"ל, אנחנו רואים גם כאן, לכן בואו גם נגדיר שזה אופציונלי, לא חייב שיהיה לי אובייקט h-group, והנה נפטרנו מהבעיה הזאת שהייתה לנו פה.

  19. 04:39

    האמת שנגדיר שזה Navigation Property. עכשיו אנחנו רוצים להגדיר את הצד השני. הצד השני נמצא ב-h-group. h-group שייך להרבה מתנות, או הרבה מתנות מכילות את אותו Age Group.

  20. 04:57

    לכן ה-Navigation Property זה בדיוק הצד השני. אם אני אסתכל עוד פעם על הפרוגרם, ל-Gift יש Age Group אחד, אבל ל-Age Group יש הרבה מתנות, Gifts, שהן שייכות ל-Age Group הזה.

  21. 05:12

    אז אנחנו רוצים לבוא לפה ולבנות Property, והוא Collection. אז מה שמקובל זה iCollection מסוג האובייקט שאליו אנחנו מתארים את ה-Collection, זה כמובן גיפט בודדת ונקרא לו גיפטס ברבים מפני של-H- Group יש הרבה מתנות שהן שייכות ל-H- Group הזה.

  22. 05:33

    בואו נגדיר לו שהוא גט. לרוב אנחנו לא רוצים שמישהו יכניס לפה ערך אז אנחנו רושמים גט ומיד יוצרים קולקשן. המערכת רק תמלא אותו, את הקולקשן. קולקשן מקובל באנטיטי פריימורק לייצר אותו מסוג hash set.

  23. 05:51

    השסט זה קולקשן שאומר כל פריט יכול להיות פה פעם אחת. לא הגיוני שיהיו לי פה שתי מתנות מאותו דבר בדיוק ל-H Group. אז השסט מכיל פריט אחד מכל דבר, אולי אי אפשר לשכפל בו פריטים.

  24. 06:06

    בואו נגדיר שגם זה Navigation Property ויש לנו כרגע קודם כל רק את ה-Properties עצמם שמוגדרים בצורה נכונה. שוב פעם בואו נראה מתנה יש ל-H Group אחד ויחיד.

  25. 06:20

    זה כן יכול להיות גט וסט, זה אופציונלי. אבל ל-H Group יש הרבה מתנות, לכן זה קולקשן. מיד התחלנו את הקולקשן, המערכת תוסיף, תוסיף, תוסיף פריטים לקולקשן הזה.

  26. 06:32

    בגלל שכבר עשינו New Collection, אנחנו לא רוצים שמישהו יעשה עוד פעם שווה New, אז הורדנו את ה-set, וזה רק גטר כזה. עוד דבר שחשוב לציין, כאשר אנחנו בונים אותם, בעל לעשות משהו שנראה טיפה מוזר ונקרא virtual.

  27. 06:51

    Navigation Properties, נכון להוסיף להם את המילה virtual. אז מה זה virtual? אנחנו מכירים את המילה virtual בתור Object Oriented, אם אני בונה לדוגמה פונקציה או מאפיין ואני אומר שבהמשך מישהו הולך לדרוס לי את זה, אז אני רוצה לעשות אותו כמאפיין או פונקציה וירטואליים, ואז אפשר לדרוס אותו עם המילה Override.

  28. 07:17

    אבל כאן זה מציין משהו אחר ל-Entity Framework. מה שזה מציין זה שהמאפיין הזה יכול להיטען בצורה שנקראת Lazy Loading. Lazy Loading אומר שכשאני מביא מידע, אני לא רוצה שאוטומטית הוא יביא לי את כל מה שמשוייך למידע הזה. כלומר, אם אני מביא מתנה, אולי אני לא רוצה שהוא יביא לי את ה-H Group שלה.

  29. 07:42

    או אם אני מביא את ה-H Group מהדאטה בייס, אולי אני לא רוצה שהוא יביא לי את כל המתנות מאותו H Group. הגיוני, אני לא רוצה בהכרח את כל המתנות מה-H Group שמביאים לי H Group. אז יש קונספט שנקרא Lazy Loading, יהיה לנו פרק נפרד על Loading Strategies, זה נקרא אסטרטגיות טעינה של המידע של NTT

  30. 08:00

    Framework, אבל כל מה שזה אומר שאנחנו מאפשרים שזה יטען בצורת Lazy Loading, זה מה שזה אומר. אם אנחנו לא נאפשר את זה, לא יהיה virtual ואנחנו ננסה לבצע lazy loading אז הוא יקרוס.

  31. 08:17

    לכן מאוד חשוב שnavigation properties יוגדרו בעזרת virtual אבל אנחנו נדבר על זה בהרחבה בפרק על אסטרטגיות טעינת מידע של האנטיטי פריימורק.

  32. 08:27

    כרגע אני בונה navigation property הוא virtual. זה עדיין סתם מאפיין שקיים לי וגם זה סתם קולקשן מאפיין שהוא קולקשן שקיים לי.

  33. 08:38

    איפה בדיוק אמרנו לאנטיטי פריימורק שהדבר הזה זה גיפט שבעצם שייך לפוסט, זה מתאר את כל המתנות של אותו h-group או שהדבר הזה מתאר את ה-h-group של מתנה ספציפית, זה סתם מאפיין.

  34. 08:54

    איך אנטיטי פריימורק תדע פשוט לשייך אותם ואם אני ארצה אוטומטית להביא את כל המתנות ששייכות ל-h-group שהיא תמלא את ה-collection הזה או אוטומטית אם אני אני רוצה ש-entity framework תביא את ה-age group של מתנה, היא תמלא את זה?

  35. 09:10

    אני צריך להגיד את זה. ואנחנו אומרים את זה על ידי attributes. וה-attributes שאנחנו אומרים כאן, שימו לב, אני ב"מתנה", ב-gift, מעל ה-age group, זה מי זה ה-navigation property שמקביל אליי מהצד השני, מהצד השני של ה-relation.

  36. 09:26

    זה נקרא inverse property. תכף אני אמלא את המחרוזת הזאת, בואו בינתיים נשים אותה כאן, אולי נזיז את זה ואז יהיה קצת יותר ברור, אחד ליד השני. כאן אני אומר מי זה החבר שלי בצד השני של הריליישן.

  37. 09:40

    אם אני מסתכל על ריליישן כל קשר מחבר בין שני צדדים לרוב בין שתי טבלאות לפעמים יש קשר שמחבר בין עמודה לעמודה אחרת באותה טבלה מאוד נדיר אבל ברוב לרוב לרוב זה בין שתי טבלאות אז מה שאנחנו אומרים פה זה בצד אחד יש לי גיפטס בצד השני אייג' גרופס אז הנביגיישן פרופרטי של זה מתאר את זה והנביגיישן

  38. 10:05

    פרופרטי הזה מתאר את אלה אז כל מה שאנחנו צריכים להגיד לו זה מתאר את גיפטס וזה מתאר את אייג' גרופ ממש איזה navigation properties משויכים אחד לשני אז קודם כל זה סוגר לנו את ההוראה

לקורס המלא: קורס Entity Framework Core

ההרצאה הקודמת: מאפייני קונפיגורציה - Data Attributes

ההרצאה הבאה: יצירת Context Class - לגישה למסד הנתונים

הרצאות קשורות מקורסים אחרים

  • שימוש ב-Entity Framework - חלק 1
  • מבנה טבלאות
  • מאפייני טרנזקציה - ACID
  • הסבר על Console - דוט-נט Framework vs Core

קורסים נוספים במסלול

  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס MVC
  • קורס Git ו-GitHub עם Visual Studio