PracticU

יצירת Stored Procedure
שאינה מתאימה למחלקת Model

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

יצירת Stored Procedure שאינה מתאימה למחלקת Model
מה קורה כש-Stored Procedure מחזירה נתונים שאינם תואמים בדיוק למחלקת Model? ההרצאה מראה את ההבדל בין שני סוגי Stored Procedure ומדגימה את הקריסה שמופיעה כשמנסים לקרוא לשנייה כאילו הייתה מהסוג הראשון.
איך זה עובד
1. Model mapping: Stored Procedure שהקודמת החזירה את כל העמודות של טבלת המתנות. מכיוון שהמידע תואם לאובייקט Gift, אפשר לקרוא לה מתוך האוסף gifts ולקבל list של Gift. סוג כזה נקרא model mapping stored procedure.
2. Procedure חדשה: יוצרים get gifts by price range עם create or alter procedure. היא מקבלת שני משתנים מסוג money, המחיר המינימלי והמקסימלי (משתנים ב-SQL מתחילים ב-@).
3. מידע שונה מהמודל: ה-select מחזיר שם, מחיר ומע"מ, שהוא המחיר כפול 0.17, עם where על טווח המחירים ו-order by price. אין כאן מזהה, אין h group id, ויש שדה מע"מ שלא קיים ב-Gift.
4. המיגרציה: מוסיפים את ה-create ואת ה-drop (drop procedure if exists) למיגרציה. כדי שתרוץ שוב, מוחקים מטבלת היסטוריית המיגרציות את המיגרציה האחרונה ומריצים update database.
5. הקריאה מהקוד: מעתיקים את הפונקציה הקודמת, מגדירים מינימום 10 ומקסימום 40 ושולחים אותם עם FromSql, כדי להימנע מ-SQL injection.
6. הקריסה: התוכנית קורסת עם ההודעה the required column gift ID was not present in the results of a from sql operation.
שימו לב
- אותה בעיה תופיע גם עם FromSqlInterpolated וגם עם FromSqlRaw.
- אי אפשר לקרוא ל-Procedure כך אם היא לא ממלאת בדיוק את כל השדות של פריט באוסף שממנו קוראים.
- Stored Procedure שמחזירה מידע אחר נקראת query mapping או DTO mapping. DTO הוא data transfer object, והפתרון מוסבר בהרצאה הבאה.
אחרי ההרצאה אפשר להבחין בין Stored Procedure שתואמת למודל לבין אחת שלא, ולזהות את הקריסה האופיינית.
השיעור הבא בקורס: שימוש ב-Stored Procedure על-ידי DTO

פרקי ההרצאה: יצירת Stored Procedure שאינה מתאימה למחלקת Model

  1. 00:00

    מיפוי מודל ל-Stored Procedure

  2. 00:40

    Procedure שאינה תואמת למודל

  3. 01:36

    הגדרת פרמטרי טווח המחירים

  4. 02:14

    סינון ומיון התוצאות

  5. 03:10

    שילוב ה-Procedure במיגריישן

  6. 04:06

    טעינת ה-Procedure בדאטאבייס

  7. 04:47

    Query Mapping לעומת DTO

תמלול ההרצאה: יצירת Stored Procedure שאינה מתאימה למחלקת Model

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

  1. 00:02

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

  2. 00:32

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

  3. 00:54

    בואו ניגש, נעתיק את כל הסטורט פרוסיג'ר הזאת לסטורט פרוסיג'ר הנוספת. נגדיר create stored procedure ונקרא לה בוא נגיד משהו שעשינו בעבר get gifts by price range. עשינו כל מיני שאילתות חלק בלינק חלק ברוקווירי שמחזירות רשימת מתנות

  4. 01:19

    כתלות בטווח מחירים. אז בואו נבנה stored procedure שמבצעת משהו דומה. create or alter procedure בואו נקרא לה בדיוק את השם הזה ונגיד שאנחנו רוצים לקבל משתנה מין פרייס כל המשתנים של סטורט פרסידג'ר מתחילים בשטרודל הסוג שלו זה money כי זה מה שמוגדר בדאטאבייס וזה הגיוני כי זה money max

  5. 01:46

    price money אנחנו רוצים להחזיר סטורט פרסידג'ר או להחזיר מידע למעשה שהוא קצת שונה ממודל מקורי של gift אז בואו נחזיר name וprice וגם נחזיר את המע"מ שזה price כפול 0.17 כל זה מגיע מתוך gifts ויש לנו where נגדיר שהprice יש לנו כאן את המשתנה שטרודל מין פרייס אנד שטרודל מקס פרייס ובוא נניח שאנחנו אפילו

  6. 02:26

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

  7. 02:50

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

  8. 03:05

    יש לנו כרגע סטורד פרוסיג'ר שמתעסקת בסלקט שמחזיר מידע שלא תואם למודל, קודם כל אנחנו רוצים לשלב את זה פה ולהגיד הנה יש לנו פה את ה-create, get gift by price range ובואו נשכפל את זה ויש לנו כאן את ה-drop, get gifts by price range.

  9. 03:30

    אחרי שעשינו את זה אנחנו רוצים לגרום לטעינה של הדבר הזה בדאטאבייס, אז אנחנו חוזרים לדאטאבייס למעשה ובדאטאבייס אנחנו רוצים לפנות טבלאות לטבלה הזאת של היסטוריית המיגריישן ונבצע מחיקה של המיגריישן האחרונה delete ואז אם אנחנו חוזרים ונבצע update database אז הוא יריץ מחדש את המיגרציה הזאת וישמור את ה-view ושתי ה-start procedure ב-database

  10. 04:06

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

  11. 04:22

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

  12. 04:38

    אנחנו רוצים משהו שעשינו בעבר, את זה בעצם, זה היה מספר 5 ואנחנו רוצים מספר 6. זה לא יהיה מודל מפינג, זה יהיה או query mapping או dto mapping. תכף נבין מה זה dto.

  13. 05:00

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

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

ההרצאה הקודמת: הגנה מהתקפת SQL injection

ההרצאה הבאה: שימוש ב-Stored Procedure - על-ידי DTO

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

  • הכל על Stored Procedure
  • קריאה ל-Stored Procedure
  • The V Model
  • יצירת מודל - Product Model

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

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