מדריך ASP.NET MVC

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

‏ • Hi Tech

בפרק הקודם השתמשנו בשירות של NuGet ולמדנו כיצד להתקין חבילות תוכנה אל תוך הפרוייקט שלנו. 

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

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

התקן את חבילת התוכנה EntityFramework בעזרת ממשק הניהול NuGet. נכון לכתיבת שורות אלו Entity Framework הינה בגרסא 5.0. לפרטים נוספים על התקנת חבילות תוכנה בעזרת NuGet ניתן לחזור לפרק הקודם במדריך.

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

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

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

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

  private AddressBookDB()
    : base("AddressBookDB")
  {
  }

  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();
  }

  public class Initializer :
    DropCreateDatabaseIfModelChanges<AddressBookDB>
  {
    protected override void Seed(AddressBookDB context)
    {
      Group root = new Group() { Name = "~" };
      context.Items.Add(root);

      Group friends = new Group() { Name = "Friends" };
      root.AddItem(friends);

      Person ori = new Person() {
        FirstName = "Ori",
        LastName = "Calvo" 
      };
      root.AddItem(ori);
    }
  }
}

לפני שנריץ את התוכנית יש לבצע שינוי נוסף. כאמור, Entity Framework תיצור מסד נתונים חדש עפ”י מבנה המחלקות שלנו. ברצוננו כי מסד הנתונים החדש יאותחל בכמה פריטים שיגודרו בקוד באופן אוטומטי ולא על ידי המשתמש.

פתח את הקובץ Global.asax.cs. זהה את הפונקציה Application_Start ותקן אותה באופן הבא

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    Database.SetInitializer(new AddressBookDB.Initializer());
}

הרץ את התוכנית ובחן כיצד המערכת עובדת כנדרש וכי ניתן להוסיף אנשי קשר חדשים וכן קבוצות חדשות.

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

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

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

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

image

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

image

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

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

image

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

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

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

  ...
}

Addresses– טבלה זו מכילה את כל הכתובות של אנשי קשר בספר. טבלה זו נוצרה כתוצאה מכך שהמחלקה Person מכילה Property מסוג ICollection<Address>

 

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

תגיות: , , , ,

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