פורסם בתאריך 26/10/2011 15:15 על ידי צביה גיטלין טרוינה

עם שחרור גרסת “Mango” של מערכת ההפעלה Windows Phone אנו, המפתחים, קיבלנו תוספת חזקה ומשמעותית ל-API הקיים: מנוע מסד נתונים מקומי על המכשיר. מנוע המסד שעל המכשיר מבוסס על מנוע SQL CE. אפליקציות מנגו מתמשות ב- LINQ to SQL עבור כל הפעולות הקשורות למסדי נתונים. טכנולוגיית LINQ to SQL מספקת גישה מונחית עצמים לעבודה עם נתונים ומורכבת ממודל אובייקטים וסביבת ריצה (Object Model & Runtime). קבצי מסד הנתונים מאוכסנים במכשיר ב- Isolated Storage וזמינים לאפליקציה בלבד (מכאן שאפליקציות אינן יכולות לחלוק מסד נתונים).

תרחישים לשימוש במסד הנתונים המקומי אפשריים במקרים כדוגמת:

- אפליקציות "רשימת קניות"

  • מסדי נתונים בעלי סכמה מורכבת, מכילים במקרים רבים מספר מועט של טבלאות (5-7), מאות רשומות וכמות גדולה מאוד של קשרים, הגבלים ומפתחות חיצוניים (Foreign Keys).

- אפליקציות "מילון"

  • נתוני Reference – במקרים רבים כמות עצומה של נתוני Reference עם מעט מאוד טבלאות (2-3) והגבלים. הטבלאות (אחת או שתיים מהן) מחזיקות כמות עצומה של נתונים (500K-1M).

- Cache מקומי עבור אפליקציות

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

טכנולוגיית LINQ to SQL מספקת יכולות מיפוי יחסים בין האובייקטים (ORM) המאפשרות לאפליקציות מנוהלות להשתמש ב- LINQ בכדי לתקשר עם מסד נתונים רלציוני. LINQ to SQL ממפה את מודל האובייקטים המובע באמצעות קוד מנוהל של סביבת .NET למסד נתונים רלציוני. בזמן ריצת האפליקציה LINQ to SQL מתרגמת שאילתות LINQ ל"שפת" מסד הנתונים ושולחת את הביטויים למסד הנתונים לביצוע. כאשר מסד הנתונים מחזיר תשובה לשאילתא LINQ to SQL מתרגמת את התשובה חזרה לאובייקטים.

LINQ to SQL עובדת עם DataContext המגדיר את מודל האובייקטים של הנתונים. בד"כ, DataContext מגדיר את הנתונים תוך שימוש ב- POCO (Plain Old CLR Object) ומוסכמות של Attributes. ע"מ ליצור מחלקות DataContext משלנו עלינו לרשת ממחלקת הבסיס DataContext. DataContext משתמש במחלקה מנוהלת המגדירה את מבנה מסד הנתונים ע"י הגדרת המבנה הטבלאי ומיפוי בין מודל האובייקטים וסכמת מסד הנתונים. המיפוי נוצר ע"י הוספת attributes של מיפוי לאובייקט. Attributes אלו מגדירות תכונות ספציפיות של מסד הנתונים כגון טבלאות, עמודות, מפתחות עיקריים, אינדקסים ועוד.

יצירת מסד נתונים

גישת "קידוד תחילה" (Code First) שעושה שימוש במחלקה מנוהלת בכדי להגדיר את הסכמה וליצור את מסד הנתונים היא הגישה המועדפת עבור אפליקציות Windows Phone. כמה נקודות הנוגעות למסד נתונים מקומי הנוצר ע"י אפליקציה:

- מסד נתונים מקומי מתופעל רק באמצעות האפליקציה שייצרה אותו.

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

- מסד נתונים מקומי תומך במכניזם השאילתות LINQ to SQL בלבד. לא קיימת תמיכה בT-SQL -.

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

clip_image001

המחלקה המגדירה את טבלת Category היא פשוטה מאוד:

image

וטבלת Product:

image

הדבר היחיד שחסר במחלקות האלה הוא היחס ביניהן. ב- LINQ to SQL אנו צריכים להוסיף תכונה (Property) שעליה מודבקת Association Attribute. אותה Attribute צריכה להתווסף לשני חלקי הקשר (Relation). מחלקת Category צריכה להחזיק סט של ישויות מסוג Product, וכך אנו מוסיפים תכונה מסוג EntitySet<T>:

image

על-מנת לאתחל את התכונה הזאת כיאות הבה נשנה את ה- Constructor של המחלקה ונוסיף שתי שיטות (Methods) שיעזרו לנו:

image

הקוד הזה מטפל באיתחול נכון של ישות Product עבור ה- Category הנוכחי. עכשיו ניתן לשנות את מחלקת Product. יש לה קשר (Relation) לישות מסוג Category ולכן עלינו להוסיף תכונה מסוג EntityRef<T>:

image

לבסוף עלינו לאתחל את המשתנה EntityRef – נשנה את ה- Constructor:

image

כעת ניצור את מחלקת DataContext שלנו:

image

מעתה ואילך ניתן להשתמש ב- SimpleDC ליצירת מסד נתונים על המכשיר ולבצע מולו פעולות.

יצירת סכמת מסד נתונים עבור מסד נתונים פשוט היא יחסית קלה ולא מורכבת, שימוש במסד נתונים קצת גדול (ומורכב) יותר הופך לפרובלמטי יותר בהקשר של יצירת ה- DataContext. ע"מ להשתמש במסד נתונים מורכב יותר כמו "AdventureWorks" הידוע – עבור דוגמת SQL CE עלינו לייצר סכמה מאוד מורכבת:

 

· הסכמה ממוזערת בכדי להתאים לדף זה.clip_image002

ה- DataContext עבור מסד נתונים זה ייסתכם בכ-2500 שורות קוד... מה בנוגע ליצירה ידנית של DataContext עבור מסד נתונים זה? ברור שיצירת DataContext עבור מסד נתונים זה אינה תהלליך פשוט. האם לא ניתן להשתמש במסדי נתונים מהעולם האמיתי עבור אפליקציות Windows Phone?

ובכן... ברור שזה אפשרי אך אנו נזדקק לעזרים חיצוניים בכדי לייצר את מחלקת DataContext המורכבת. הבה נייצר DataContext. ה-SDK של Windows מכיל עזר (Utility) ליצירת DataContext עבור LINQ to SQL למסדי נתונים המבוססים על SQL Server ו- Compact SQL Server, עזר זה נקרא sqlMetal. נשתמש בו ע"מ ליצור את קובץ ה-DataContext.

הערה: sqlMetal אינו תומך ישירות במסדי נתונים מסוג SQL CE של Windows Phone ולכן קבצי DataContext שנוצרו באמצעות sqlMetal לא יקומפלו באופן מיידי במפרוייקט מסוג Windows Phone. השתמשו בהם כנקודת פתיחה בכדי לחסוך עבודת קידוד מרובה.

הבה ניצור את קובץ ExternalDC.cs (נשתמש בו לאחר היצירה בפרויקט הדוגמה שלנו)

image

לאחר הוספת הקובץ שנוצר לפרויקט עלינו להסיר שני Constructors שאינם נתמכים ע"י מנגו:

image

לאחר הסרתם הקובץ מתקמפל וה- DataContext המורכב שלנו מוכן.

בחלק הבא של המאמר נסקור את השימוש במסד הנתונים שיצרנו.