
INorthwindService עם פונקציה אחת: DeleteOrder(int orderID).using (TransactionScope ts = new TransactionScope()).DeleteAllOnSubmit, SubmitChanges, ואחר כך מחיקת ההזמנה עצמה.ts.Complete(). אם לא קוראים לו, בסיום הבלוק (Dispose) כל השינויים מבוטלים.הטקסט המלא של הדקות הראשונות בהרצאה «Server Transaction» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא הטרנזקציות. טרנזקציה זה בעצם מספר פעולות שיכולות להתרחש שיש ביניהן קשר מאוד הדוק, כך שהמערכת מסתכלת על כל מגוון הפעולות האלה כפעולה אטומית אחת ויחידה.
זאת אומרת, אם אחת מהפעולות נכשלת, מבחינת המערכת כל הפעולות לא יצליחו להתבצע בפועל. אם כל התת-פעולות האלה יצליחו, אז רק באמת זה נחשב שכולם אכן יצליחו פיזית.
לדוגמה, פעולות על מסד נתונים. כאשר אנחנו מתעסקים ב-WCF בטרנזקציות, יש לנו שני סוגים של טרנזקציות. יש לנו Server Transaction ויש לנו Client Transaction.
Server Transaction זו טרנזקציה שמתבצעת בצד של השרת, מתחילה ונגמרת בצד של השרת. Client Transaction זו טרנזקציה שמתחילה ונגמרת בצד של הקליינט.
בואו נראה קודם כל דוגמה ל-Server Transaction ואחר כך ל-Client Transaction. ויש לנו כאן DLL חדש שהוספתי, זה נקרא Northwind Service Library.
Northwind זהו מסד נתונים חינמי של מייקרוסופט שעוסק בחברה ליבוא וייצוא מוצרי מזון ייחודיים מכל העולם, וזה מסד נתונים חינמי אז קל מאוד לעבוד עליו.
אז בואו נניח שיש לנו איזשהו שירות שמספק לנו אפשרויות לבצע כל מיני פעולות על מסד הנתונים Northwind. אז בואו נוסיף כאן איזשהו אינטרפייס בכדי להתחיל לבנות את השירות הזה.
ואנחנו פשוט רוצים לעשות אינטרפייס כללי שמתעסק בנורת'ווינד נקרא לו iNorthwindService תמחוק את זה. אורייט, נגדיר את האינטרפייס הזה כפאבליק ונבנה בתוך האינטרפייס הזה פונקציה אחת ויחידה שכל מה שהיא תעשה זה delete order ותקבל int order ID ותמחוק את ההזמנה.
בואו נצרף כרגע את System.ServiceModel System.ServiceModel בכדי להגדיר את ההגדרות המתאימות מעל האינטרפייס. יש לנו פה Service Contract ויש לנו כאן את Operation Contract.
ניפטר מכל מה שלא צריך וסיימנו להגדיר את האינטרפייס. כעת אנחנו עוברים לבנות את המחלקה. נצרף New Item, יש לנו קלאס. הקלאס תמיד רצוי לכתוב בדיוק כמו שם הממשק רק בלי ה-i, זאת אומרת שהקלאס נקראת Northwind Service.
נבצע Add, נגדיר אותה כ-Public, נירש את i Northwind Service ונממש אותו. כעת אנחנו צריכים לראות איך בנוי מסד הנתונים בכדי להבין איך לכתוב את הפונקציה Delete Order.
אז בואו ניגש למסד הנתונים, נתחבר אליו, ניגש למסד הנתונים Northwind. אנחנו פה נמצאים ב-SQL Server, Northwind, טייבלס ויש לנו את הטבלה Orders.
אז אם אנחנו מסתכלים על הרשומות של הטבלה orders אנחנו רואים שלכל רשומה כל הזמנה יש order ID. בואו ניקח את 102.49. 102.49 זה הזמנה שביצע איזשהו לקוח שזה ה-ID שלו אבל אני לא יכול סתם כך ללכת ולמחוק את ההזמנה הזאת.
מה שאני צריך לעשות זה לבצע קודם כל מחיקה של הפירוט של ההזמנה. נסתכל ונראה שיש כאן עוד טבלה שנקראת order details. בואו ניכנס אליה ונראה שעבור 102.49 יש שני מוצרים שונים שנקנו בהזמנה 102.49. בהזמנה 102.50 יש שלושה מוצרים שונים, אוקיי?
לכן אם אני רוצה באמת למחוק הזמנה אני צריך קודם כל למחוק את הפרטים שלה ורק לאחר מכן אני יכול למחוק את ההזמנה עצמה, מפני שהקשר בין שתי הטבלאות לא מאפשר לי לעשות את זה אוטומטית, אני צריך לעשות את זה ידנית.
אוקיי, אז יש לנו פה את הטבלת אורדר, יש לנו פה את ה-Order Details, ואנחנו יכולים לגשת ולבנות את המערכת שהולכת למחוק לנו הזמנה לפי קוד הזמנה שקיבלה.
היא כמובן קודם כל תמחוק ב-Order Details ורק אחר כך ב-Orders. לצורך כך בואו נוסיף New Item ונתחבר על ידי Link to SQL, נאתר כאן את Link to SQL Classes, נקרא לקובץ Northwind, זהו קובץ DBML שמאפשר לי גישה למסד הנתונים וביצוע פעולות נגדיר את הסרבר אקספלורר, נמחק קונקשנים לא
קשורים ונתחבר למסד הנתונים. אז אנחנו נמצאים ב-SQL סר... SQL אקספרס, נאתר כאן את נורת'ווינג, הנה הוא, נבדוק שאכן הקונקשן הצליח ונתחבר עם קונקשן של נורת'ווינג.
כעת אנחנו יכולים לפתוח את הטבלאות ולהוסיף כרגע את הטבלאות הרצויות. אז אנחנו הולכים להתעסק כרגע עם אורדרס, ו-order details בואו נסמן אותם ופשוט נגרור אותם לאזור הלבן הזה.
המערכת יוצרת לנו אובייקטים מתאימים, אנחנו רואים אותם, נשמור, אפשר לסגור את הקובץ הזה, נבצע איזשהו ריבילד בכדי שהמערכת תזהה לנו את האובייקטים שהיא יצרה, ריבילד, succeeded, ועכשיו אנחנו יכולים לכתוב את הקוד.
אז מה שאנחנו רוצים לעשות זה פשוט מאוד לבנות אובייקט מטיפוס NorthwindDataContext שבעזרתו אנחנו נבצע מה שאנחנו רוצים במסד הנתונים, כרגע זה יהיה מחיקה של אורדר.
בואו בתוך הפונקציה deleteOrder נפתח NorthwindDataContext וראשית נאתר את ההזמנה שאנחנו צריכים למחוק מ-OrderDetails מהטבלה OrderDetails אז יש לנו פה var query שאני רוצה לשאול בשפת לינק language integrated query From Order Details OD in DC.OrderDetails