וובמאסטר - תיכנות ובניית אתרים

מדריך ASP.NET MVC – עבודה עם מסדי נתונים

ori_calvo ,‏ מכללת הי טק‏ ‏/‏ 11 פברואר, 2011
F+
F-

בפרק הקודם השתמשנו בשירות של NuGet והתקנו את חבילת התוכנה Entity Framework Code First.

בפרק זה נראה כיצד ניתן לעדכן את המודל כך שיעבוד מול מסד נתונים. אנו ניווכח לדעת ששינוי זה כלל איננו מורכב וכי ASP.NET MVC בשילוב עם Entity Framework Code First מאפשר לנו להשתמש בכל אובייקטי המודל שהגדרנו עד עכשיו ולשמור אותם בקלות אל תוך מסד הנתונים.

להורדת הקוד של הפרק הקודם לחץ כאן

בחן את אובייקטי המודל הקיימים. שים לב כיצד כל המחלקות לרבות BookItem, Person ו-Group הינן מחלקות פשוטות המעוטרות ב-Attributes השונים של DataAnnotation (ראה פרקים קודמים).
המחלקה AddressBookDB מנהלת את אוסף האובייקטים אשר מייצגים את ספר הכתובות כולו ומחזיקה רשימה כללית שלהם בזכרון של המחשב.  אנו נעדכן מחלקה זו כך שתבצע עבודה מול מסד נתונים.
הספריה Entity Framework Code First דואגת למיפוי של אובייקטי המודל אל תוך מסד הנתונים באופן כמעט אוטומטי שאינו דורש כתיבת קוד. כל מה שנשאר לנו לעשות הוא לתקן את המחלקה AddressBookDB כך שתעשה שימוש בספריה.

פתח את הקובץ Models\AddressBookDB ועדכן אותו באופן הבא:

public partial class AddressBookDB : DbContext
{
  public DbSet<BookItem> Items { get; set; }

  private AddressBookDB()
    : base("AddressBookDB")
  {
    if (this.Database.Exists())
    {
        this.Database.CompatibleWithModel(false);
    }

    if (!this.Database.Exists())
    {
      this.Database.Create();

      Seed();
    }
  }

  public static AddressBookDB Create()
  {
    return new AddressBookDB();
  }

  public Group Root
  {
    get
    {
      return (from item in this.Items
              where item.Parent == null
              select item as Group).Single();
    }
  }

  public BookItem FindItemByID(int id)
  {
    return (from item in this.Items
            where item.ID == id
            select item).SingleOrDefault();
  }
}

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

פתח את הקובץ Models\BookItem.cs ועדכן את הקוד באופן הבא:

public abstract class BookItem
{
  public int ID { get; set; }
  public virtual Group Parent { get; set; }
  public abstract string Description { get; }
}

על מנת לקמפל את הקוד בהצלחה יש להוסיף Reference ל-Assembly הבא: System.Data.Entity.
הרץ את התוכנית ובחן כיצד המערכת עובדת כנדרש וכי ניתן להוסיף אנשי קשר חדשים וכן קבוצות חדשות.

יש לציין כמה נקודות חשובות לגבי השינוי שביצענו בקוד:

  • לא נדרש שום שינוי באובייקטי המודל !!!
  • המחלקה PhoneBookDB יורשת ממחלקה תשתית של Entity Framework Code First הנקראת DbContext. מחלקה זו יודעת לייצר מסד נתונים חדש על סמך התצורה של אובייקטי המודל
  • ברירת המחדל למסד הנתונים הינה Sql Server Express. ניתן לשנות זאת ע"י העברת פרמטר מתאים לבנאי של המחלקה DbContext.

פתח את ה-Database Explorer ע"י בחירה של התפריט הבא: View | Database Explorer והתחבר למסד הנתונים

image

הוסף התחברות חדשה למסד הנתונים ע"י לחיצה על כפתור ה-"+" ועדכן את הבחירות הבאות בחלון שנפתח:

image

שים לב כי קיים מסד נתונים חדש בשם AddressBookDB. מסד זה נוצר כתוצאה מהעבודה שלנו מול השירות של Entity Framework Code First. לחץ על "OK".

בחן את ה-Schema של מבנה הנתונים החדש:

image

מסד הנתונים מכיל שתי טבלאות:

BookItems – טבלה זו מכילה את כל הפריטים בספר לרבות קבוצות ואנשי קשר. טבלה זו נוצרה כתוצאה מכך שהגדרנו בתוך המחלקה AddressBookDB משתנה מסוג DbSet:

public partial class AddressBookDB : DbContext
{
  public DbSet<BookItem> Items { get; set; }

  ...
}

EdmMetadata – זוהי טבלה ניהולית של Entity Framework Code First בעזרתה התשתית עוקבת אחר ה-Schema של המודל אל מול ה-Schema של מסד הנתונים ומבטיחה כי השתיים זהות.

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

image

למזלנו, ניתן לזהות מצב שכזה בעזרת המחלקה DbContext וליצור את מסד הנתונים מחדש (או לחילופין ניתן לתקן את המסד באופן ידני). פתח את הקובץ AddressBookDB.cs וזהה את הבנאי של המחלקה. עדכן את הקוד באופן הבא:

public AddressBookDB()
  : base("AddressBookDB")
{
  if (this.Database.Exists())
  {
    try
    {
      this.Database.CompatibleWithModel(false);
    }
    catch (InvalidOperationException)
    {
      this.Database.Delete();
    }
  }

  if (!this.Database.Exists())
  {
    this.Database.Create();

    Seed();
  }
}

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

 

בפרק זה למדנו כיצד ניתן ליישם את המודל אל תוך מסד הנתונים. ראינו כי התהליך כמעט ואיננו דורש קוד. המחלקה המרכזית אשר אחראית על המרת המודל למסד הנתונים הינה DbContext והיא חלק מהתשתית הקרויה Entity Framework Code First. בפרק הבא אנו נמשיך לפתח את מסד הנתונים והמודל ונוסיף תמיכה במשתמשים והרשאות.

תגיות: מדריך‏  /  צד שרת‏  /  פיתוח‏  /  ASP.NET MVC‏  /  .net‏  

תגובות בפייסבוק

תגובות למאמר



תגיות פופולאריות

מערכות תוכן

וובמאסטר © כל הזכויות שמורות