PracticU

הוספת פעולות CRUD
קריאה - הוספה - עדכון - מחיקה

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

הוספת פעולות CRUD קריאה - הוספה - עדכון - מחיקה
ההרצאה בונה בתוך CustomersService את פעולות ה-CRUD על לקוחות: קריאה, הוספה, עדכון ומחיקה, ועוד חיפוש לפי אימייל. הקונטקסט נמצא רק בתוך המחלקה הזו, וכל השאר רק קוראים לה.
השלבים העיקריים
1. קריאת כל הלקוחות: GetAllCustomers מחזירה List<Customer> מ-customers.ToList().
2. קריאת לקוח בודד: GetOneCustomer מקבלת int id ומחזירה Customer? עם סימן שאלה, כי ה-ID עלול לא להתקיים. משתמשים ב-SingleOrDefault.
3. הוספה: המרצה אומר שכמעט תמיד כדאי לקבל אובייקט Customer שלם, במיוחד בשירות REST API. הפונקציה עושה db.customers.Add ואחריו db.SaveChanges. ה-ID לא נקלט, כי הדאטה בייס מייצר מספור אוטומטי.
4. העמסה נוספת: גרסה שמקבלת שם פרטי, שם משפחה ואימייל בנפרד, יוצרת אובייקט Customer וקוראת לגרסה הראשונה. כך לא חוזרים על קוד.
5. עדכון: Attach על האובייקט, הגדרת db.Entry(customer).State כ-Modified ואז SaveChanges. גם כאן יש שתי גרסאות.
6. הבדיקה לפני Attach: אם האובייקט כבר נטען באותו קונטקסט, Attach יקרוס. לכן עושים Attach רק כש-State הוא Detached. הבדיקה נחוצה כי המחלקה לא שולטת בשימוש בה והקונטקסט שלה חי לאורך זמן.
7. מחיקה: DeleteCustomer מקבלת רק ID. היא קוראת ל-GetOneCustomer, ואם הלקוח null פשוט חוזרת בלי חריגה. אחרת מבצעת Remove ו-SaveChanges.
8. חיפוש לפי אימייל: GetCustomerByEmail מחפשת עם SingleOrDefault לקוח שהאימייל שלו שווה לערך שהתקבל.
שימו לב
- המרצה מציין שמעולם לא נתקל במחיקה שמקבלת אובייקט מלא ולא קוד.
- בלי הבדיקה של Detached, קריאה ל-GetOneCustomer ואחריה Update על אותו לקוח תגרום לקריסה.
בסוף יש שירות לקוחות עם CRUD בסיסי ופעולת חיפוש, וההרצאה הבאה משתמשת בו.
השיעור הבא בקורס: שימוש במחלקת ה-Service

פרקי ההרצאה: הוספת פעולות CRUD קריאה - הוספה - עדכון - מחיקה

  1. 00:00

    אובייקט הקונטקסט רק ב-Customers Service

  2. 00:36

    בניית פעולת Get All Customers

  3. 01:08

    פונקציית Get One Customer

  4. 01:48

    פונקציית הוספת לקוח

  5. 02:45

    קבלת לקוח כאובייקט או כפריטים

  6. 03:40

    יצירת אובייקט והוספה לדאטאבייס

  7. 04:21

    העמסה שנייה לפונקציית ההוספה

  8. 05:18

    עדכון לקוח עם Attach

תמלול ההרצאה: הוספת פעולות CRUD קריאה - הוספה - עדכון - מחיקה

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

  1. 00:02

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

  2. 00:17

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

  3. 00:31

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

  4. 00:44

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

  5. 01:08

    בואו נבנה פונקציה נוספת שמחזירה לקוח בודד נחזיר customer אחד ויחיד נקרא לזה get one customer ביחיד הפונקציה תקבל int ID ואנחנו רוצים להחזיר את ה-ID יכול להיות שיביאו לי ID שלא קיים כשאני כותב פונקציה אני אף פעם לא אמור לדעת מי קורא לה ואיזה פריט הם הולכים לשלוח לי.

  6. 01:30

    אני אשים פה סימן שאלה כי יכול להיות שהלקוח בכלל לא נמצא. אנחנו פונים ל-customers ובמקום to list בואו נקרא ל-single או default.

  7. 01:40

    יכול להיות שהוא נמצא ויכול להיות שלא. עבור כל customer תחפש לי את זה שה-id שלו שווה למה ששלחו לי לפונקציה. הנה שתי פונקציות שמאפשרות קריאה של מידע read.

  8. 01:52

    בואו נתקדם ונבנה את הפונקציה שמוסיפה public void and customer. אנחנו רוצים לקבל מידע של לקוח ולהוסיף. ועכשיו השאלה הנשאלת, האם אנחנו רוצים לקבל את כל הפריטים השונים שיש ללקוח, שם פרטי, שם משפחה, אימייל, תעודת זהות, וואטאבר, או פשוט לקבל אובייקט קסטומר אחד ויחיד.

  9. 02:16

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

  10. 02:33

    זה קודם כל החלטה שלכם. כשאתם בונים שירות ובי כזה, מה שנקרא RESTful Service אולי שמעתם, REST API שנמצא על שרת מרוחק והתפקיד שלו זה לקבל מידע ולהחציל מידע, ככה אנחנו בונים אותו.

  11. 02:48

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

  12. 03:01

    אני אתחיל עם first name last name מייל אלה שלושת הנתונים שיש בקסטומר בואו נסתכל רגע ונראה שוב פעם מה יש לנו בלקוח ללקוח יש איידי כאשר אני אם מוסיף לקוח חדש אז אני לא צריך לקבל את ה-ID מהיוזר או משום מקום אחר כי הדאטאבייס מייצר לי אותו.

  13. 03:24

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

  14. 03:33

    אבל במקרה הזה של הלקוחות הגדרנו ש-ID זה לא תעודת זהות אלא זה מספור אוטומטי רץ, הדאטאבייס מייצר אותו ולכן אני לא מקבל כשמוסיפים. אז הנה ה-FirstName, הנה ה-LastName וה-E-Mail, כמובן שפה הם התחילו בעוד קטנה כי הם משתנים לוקאליים.

  15. 03:47

    ומה שאנחנו רוצים לעשות זה להוסיף אותו. איך אנחנו מוסיפים אותו? אז אנחנו רוצים בעצם לבנות Customer שווה NewCustomer ולתת לו את ה-FirstName, את ה-LastName, את ה-E-Mail בצורה כזאת והנה יש לנו אובייקט קסטומר חדש ועכשיו אנחנו יכולים להוסיף אותו לדאטאבייס.

  16. 04:09

    איך אנחנו מוסיפים קסטומר לדאטאבייס? db.customers.add הנה אובייקט הקסטומר תוסיף אותו לדטאבייס ולא לשכוח db.savechanges כדי לשמור את כל השינויים בואו ניקח את כל זה משכפל נדביק אבל נקרא לפונקציה שמקבלת אובייקט קסטומר אחד ויחיד וזה חוסך לי את זה אז יש לי פה עכשיו שתי העמסות מי שרוצה יכול לשלוח לי את כלל הפריטים בצורה בודדת מי שרוצה יכול לשלוח לי את כל האובייקט אנחנו

  17. 04:43

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

  18. 05:06

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

  19. 05:38

    לעשות לו Attach, לאחר מכן אנחנו רוצים להגיע ל-db.entry.customer.state ולהגדיר שהוא

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

ההרצאה הקודמת: יצירת מחלקת Customers Service

ההרצאה הבאה: שימוש במחלקת ה-Service

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

  • עבודה עם UITableViewController - הוספה דינמית של פריטים, מחיקה דינמית וסידור המידע ב-swipe
  • קריאה ל-Stored Procedure
  • מחיקה של מוצר ב-MySQL
  • מחיקה של משאבים בענן

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

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