PracticU

הרחבת מחלקת Model
C# Entity Framework

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

הרחבת מחלקת Model C# Entity Framework
מודלים שנוצרו ב-scaffolding נדרסים בכל הרצה חדשה, ולכן קוד שנוסף לתוכם נמחק. השיעור מראה איך מוסיפים לוגיקה למודלים בלי לאבד אותה, בעזרת partial class.
הבעיה
1. רעיון ההתחלה: רוצים לדעת בכמה מקומות אם פריט במלאי או לא. ב-Code First היו מוסיפים למודל מאפיינים InStock (Quantity גדול מ-0) ו-OutOfStock (Quantity שווה 0) עם [NotMapped]. אפשר להשתמש בהם להדפסה: ירוק לפריט במלאי ואדום לחסר, עם Console.ForegroundColor ו-Console.ResetColor.
2. מה קורה ב-Database First: מריצים שוב את פקודת ה-scaffold אחרי שינוי במסד, והמודלים נדרסים. כל הקוד שהוספנו נמחק ומופיעות שגיאות קומפילציה, כי הפקודה לא מבדילה בין קוד שהיא יצרה לקוד שלנו.
הפתרון: partial class
1. למה אפשרי: המחלקות שנוצרו הן partial. הקומפיילר מאחד את כל המחלקות באותו שם לאחת, גם אם הן בקבצים נפרדים.
2. איפה לכתוב: לא בתיקיית Models, שאפשר למחוק ולייצר מחדש. יוצרים תיקייה בשם Extensions, ובה מחלקה partial באותו שם (InventoryItem), באותו namespace. הדובר מציין שאפשר להשתמש ב-partial בשני קבצים או יותר, ושלא נתקל במקרה שצריך יותר משניים.
3. שימוש ב-partial בקוד שלנו: בקוד שנכתב ידנית לא משתמשים ב-partial. זה נועד לקוד סינתטי שמערכת כמו scaffolding יוצרת.
4. מה כן נוגעים: בקבצי המודלים לא נוגעים, פרט להוצאת ה-connection string מה-Context, שצריך לעשות אחרי כל scaffolding מטעמי אבטחה.
5. בדיקה: מחזירים את המאפיינים InStock ו-OutOfStock ל-Extensions, מריצים, ואז מריצים scaffolding מחדש. המודלים נדרסים, והפרויקט עדיין עובד.
override של ToString
1. המטרה: תיאור קריא של פריט. בונים מחרוזת details שמתחילה ב-ID, ואם Brand אינו null מוסיפים את שם המותג. אותו הדבר עבור Type. בסוף מוסיפים את הכמות, או "out of stock" אם אין במלאי.
2. למה בודקים null: מאפייני הניווט מלאים רק אם נטענו (eager או explicit loading).
3. שימוש: בתוכנית מספיק Console.WriteLine(item), כי ההדפסה קוראת ל-ToString.
4. בדיקה: אם מוותרים ב-Service על טעינת Types, הפריט מוצג בלי הסוג ולא קורס. אם מוותרים על שניהם, מוצגים רק ה-ID והכמות.
עכשיו אפשר להרחיב מודלים שנוצרו מהמסד בלי לאבד את הקוד שלכם ב-scaffolding הבא.

פרקי ההרצאה: הרחבת מחלקת Model C# Entity Framework

  1. 00:00

    הוספת מאפיין מחושב למודל

  2. 00:42

    מאפיין In Stock עם Not Mapped

  3. 02:01

    צביעת פריטים לפי מצב מלאי

  4. 03:15

    הבעיה בגישת Database First

  5. 04:07

    דריסת הקוד בהרצת Scaffolding מחדש

  6. 05:17

    שימוש ב-Partial Class להרחבה

תמלול ההרצאה: הרחבת מחלקת Model C# Entity Framework

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

  1. 00:02

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

  2. 00:42

    מה היינו עושים כאשר עבדנו בקוד פרסט טכניק היינו באים לכאן ואומרים תשמע בואו נבנה כאן עוד איזה public בוליאן in סטוק איזשהו פרופרטי נוסף שיחזיר get return האם ה-quantity גדול ב-0 זה אומר שהוא במלאי מעליו רשמנו not mapped בכדי שהמערכת בעצם לא תבנה לנו בדאטאבייס איזה משהו ממנו במידה והיינו זורקים את הכל בחזרה לדאטאבייס עם

  3. 01:19

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

  4. 01:44

    בחזרה לדטאבייס עם כל הנושא של מגריישנס וכדומה. בואו נבנה עוד אחד אנחנו רוצים לבנות out of stock ו-out of stock זה אומר שה-quantity שווה 0. בואו אולי נשתמש עם זה רגע ואז נבין מה הבעיה מה שהייתי רוצה לעשות הייתי רוצה ללכת לכאן ואני רואה שיש לנו פה הדפסות של כל הפריטים מה שהייתי רוצה לעשות זה להגיד כזה דבר אם הפריט קיים לי במלאי אני רוצה

  5. 02:16

    לצבוע אותו בירוק ואם הוא חסר במלאי, אני רוצה לצבוע אותו באדום. בואו נלך ל-console. foregroundColor, נשפיע על הצבע של הגופן, ונלך לאותו אייטם, ונשאל את השאלה האם אתה Out of Stock.

  6. 02:33

    אם אתה Out of Stock, הרי זה בוליאני וכתבנו Out of Stock, אז תן לי צבע אדום, אחרת תן לי צבע ירוק. ומייד בסיום ההדפסה אנחנו רוצים לאפס את הצבע בחזרה, console.resetColor.

  7. 02:49

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

  8. 03:07

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

  9. 03:24

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

  10. 03:43

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

  11. 04:15

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

  12. 04:41

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

  13. 04:59

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

  14. 05:10

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

  15. 05:23

    רגע, לא הייתה לנו את המילה הזאת כשעבדנו בקוד פרסט וגם לא היינו צריכים שתהיה את המילה הזאת. פרשל זה בעצם דבר גאוני של C-Sharp ומה שהוא אומר לנו זה תשמעו אני קלאס הכל בסדר אבל מותר לכם להמשיך לכתוב את הקלאס בדיוק כזאת בקובץ CS נפרד.

  16. 05:46

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

  17. 06:00

    אנחנו רוצים לכתוב את זה בתיקייה אחרת, אפשר

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

ההרצאה הקודמת: מחיקת רשומה קיימת - ממסד נתונים

ההרצאה הבאה: יצירת View במסד הנתונים - Entity Framework Core

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

  • The V Model
  • שימוש ב-Entity Framework - חלק 1
  • יצירת מחלקת מודל - Model Class
  • הרחבת GPO על-ידי ADM

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

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