PracticU

יצירה ושימוש ב-Stored Procedure
שלא מתאימות למחלקת Model

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

יצירה ושימוש ב-Stored Procedure שלא מתאימות למחלקת Model
פרוצדורה שמחזירה נתונים שלא תואמים אף מודל דורשת DTO משלה (Data Transfer Object). השיעור בונה פרוצדורה כזו ומראה איך להפעיל אותה דרך ה-Context.
השלבים העיקריים
1. ההבדל: הפרוצדורה הקודמת הייתה model mapping, כלומר החזירה את עמודות המודל. כאן מדובר ב-query mapping, שנקרא לפעמים גם DTO mapping.
2. הפרוצדורה: GetTypedInventoryItems מקבלת @TypeID (int). היא מחזירה InventoryItemID, שם המותג בשם BrandName ואת Quantity, מ-InventoryItems ב-INNER JOIN ל-Brands לפי BrandID, עם WHERE שבו TypeID שווה לפרמטר. אין לה מודל ולא View מתאים.
3. ה-DTO: בתיקיית DTOs (או בתוך Extensions) מוסיפים מחלקה BrandedInventoryItem עם InventoryItemID (int), BrandName (string, שמסומן כלא-null) ו-Quantity (nullable int). מסמנים אותה כ-Keyless. הדובר מעתיק את ההגדרות ממודלי Brand ו-InventoryItem.
4. שם הקולקשן ב-Context: כמו שעשה בגרסאות קודמות, מוסיפים DbSet של ה-DTO בשם הפרוצדורה עם הסיומת Results: GetTypedInventoryItemsResults. את הקוד כותבים ב-partial class של ה-Context בתיקיית Extensions, כדי שלא יידרס. אם ה-DTO הוא internal וה-Context public, מתקבלת שגיאת accessibility, ולכן מגדירים את ה-DTO כ-public.
5. ToString: ב-DTO אפשר לכתוב אותו ישירות, כי איש לא ידרוס אותו.
6. מתודה ב-Service: ב-InventoryItemsService, GetTypedInventoryItems(int typeId) מחזירה רשימת DTO: פנייה לקולקשן, FromSql עם שם הפרוצדורה והפרמטר, ו-ToList.
7. בדיקה: בתוכנית שולחים TypeID 1 (שמלות), ומתקבלים פריטים 1, 3 ו-5, כולם מאותו סוג ממותגים שונים: Castro, Fox ו-H&M. לכן השם Branded מתאר את התוצאה, והבחירה לפי Typed מתאימה לפרמטר.
סיכום הגישות
1. פרוצדורה של Insert, Update או Delete מופעלת עם Database.ExecuteSql.
2. פרוצדורה שמחזירה select: אם היא תואמת מודל, דרך האוסף של המודל עם FromSql. אם לא, בונים DTO.
3. פרוצדורה שתואמת View אפשר להפעיל דרך הקולקשן של ה-View.
שימו לב
אחרי כל scaffolding צריך להסיר מה-Context את ה-connection string, כי הוא מידע רגיש. מחליפים אותו בבדיקה if (!optionsBuilder.IsConfigured) עם UseSqlServer וה-connection string מ-AppConfig. בפרויקט web, לפי הדובר, יש פקודה שעושה את זה מראש.
עכשיו אפשר להפעיל Stored Procedure שמחזירה נתונים שלא תואמים אף מודל, באמצעות DTO ו-DbSet ב-partial class.

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

  1. 00:00

    סטורד פרוסיג'ר שלא מתאימה למודל

  2. 00:45

    בניית פרוצדורת Typed Inventory Items

  3. 02:06

    הרצת הפרוצדורה והצורך ב-DTO

  4. 03:01

    בניית מחלקת DTO לפריט

  5. 04:18

    הגדרת Keyless למחלקת ה-DTO

  6. 05:13

    הרחבת הקונטקסט עם Partial Class

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

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

  1. 00:02

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

  2. 00:29

    dto מפינג סטורט פרוסיג'ר אנחנו נצטרך כאילו לבנות data transfer object מיוחד עבורה. אז בואו נראה איך אפשר לעשות את זה. בואו נבנה create or alter procedure, ואנחנו רוצים להביא typed inventory.

  3. 00:45

    עזבנו את ה-customer, עברנו ל-inventory. typed inventory items זה אומר פריטים כתלות בטייפ מסוים. נניח אנחנו רוצים לראות את כל החולצות, לא משנה לנו מאיזה ברנד החולצה.

  4. 00:58

    אז אנחנו רוצים לקבל שטרודל טייפ איי-די וזה יהיה אינט מה יש לנו בתוך האינבנטורי בואו נראה רגע באינבנטורי אייטמס אם אני אעשה רגע דיזיין אז יש לנו את האינבנטורי אייטם איי-די בואו ניקח אותו ויש לנו את הברנד איי-די אז בואו נגדיר זה יהיה brands.name as brand name בואו נביא quantity from inventory items inner join

  5. 01:37

    brands on אנחנו רוצים ש-Inventory Items Brand ID יהיה שווה ל-Brands Brand ID. וה-Ware שלנו זה שה-Inventory Items.Type ID שווה ל-Stודל Type ID. אז הנה יש לנו סטורט פרוסיג'ר שמחזירה מידע שהוא לא מתאים לאף מודל שקיים עדיין, הוא לא מתאים ל-Views,

  6. 02:10

    אין לנו dto עבורו כרגע אנחנו רוצים לראות איך משתמשים איתו. בואו נבצע execute אנחנו רואים command completed successfully בואו נרפרש והנה יש לנו get typed inventory items מעולה ואנחנו חוזרים בחזרה מה אנחנו צריכים לעשות כאן בשביל להשתמש עם ה-store procedure.

  7. 02:31

    scaffolding אין לנו מה לעשות אנחנו לא מקבלים שום דבר מ-store procedures אבל אנחנו כן רוצים לבנות עבורה DTO. איך עושים את זה?

  8. 02:42

    אנחנו רוצים שיהיה לנו כל מיני DTO's, אז אנחנו יכולים לגשת לכאן ולייצר תיקייה DTO's, או פשוט לשים את ה-DTO's בתוך ה-Extensions, בתוך ההרחבות.

  9. 02:56

    זה גם בסדר. בואו נרשום כרגע את התיקייה DTO's כאן, ובתוכה אנחנו רוצים לבנות איזושהי מחלקה שמתארת בדיוק את המידע שמוחזר מה-StoredProcedure מוחזר לנו BrandedInventoryItem כי אנחנו מביאים לפי טייפ ומה שמוחזר זה ה-InventoryItem שמכיל Brand האמת שכחתי לסיים אותו ב-DTO כן תשנה לי יופי אז הנה יש לנו פה את הקלאס

  10. 03:30

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

  11. 04:00

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

  12. 04:14

    קוונטיטי, מה יש מעל הקוונטיטי? כלום. קוונטיטי מוגדר כסימן שאלה, בסדר, נגדיר אותו גם כן סימן שאלה. מה יש מעל ה-Inventory Item ID?

  13. 04:26

    Inventory Item, יש פה Key, אבל אצלנו זה גם ה-Key? בעצם לא, אצלנו זה Keyless, כי אנחנו, לא מעניין אותנו מה-key הזה. אז בואו ניקח keyless ונשים אותו פה כי זה DTO.

  14. 04:41

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

  15. 04:53

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

  16. 05:07

    ומה שעשינו זה הלכנו לקונטקסט ובנינו קולקשן מיוחד שדרכו המידע הוחזר. והקולקשן המיוחד שדרכו המידע הוחזר היה מעין קולקשן כזה של In-Stock Inventory Items אבל אני לא יכול לגעת בקונטקסט הזה מפני שבפעם הבאה שאני אעשה זה כמובן לא היה אינסטוקינג וטורי אייטם זה היה איזשהו קולקשן מתאים למידע שהוחזר אבל אם אני אסתכל אני אראה

  17. 05:37

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

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

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

ההרצאה הבאה: מסד נתונים NoSQL - MongoDB

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

  • הכל על Stored Procedure
  • קריאה ל-Stored Procedure
  • The V Model
  • הגדרה ושימוש ב-Suite Setup

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

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