Entity Framework - Part 5
אז
בפרק האחרון דברנו על מה ה - designer עושה מאחורי הקלעים עבור הסכמה שלנו, אפשר להאריך בנושא הסכמה עוד הרבה, אבל חשבתי שכדאי קצת לראות קוד ואיך לעבוד עם ה - EF ואחרי זה נסבך קצת את הסכמה.
היות שבסיס הנתונים שלנו כרגע ריק - אנחנו נכתוב קוד שיכניס בו נתונים ונדון בכמה נושאים.
כדי לעבוד עם EF אנחנו חייבים לייצר מופע של מחלקה שיורשת מ - ObjectContext במקרה שלנו EFLabEntities,
using (EFLabEntities context = new EFLabEntities())
{
}
במקרה שלנו יהיה חכם לעשות את זה עם using כי אנחנו רוצים לייצר את ה - context להוסיף לו אובייקטים לשמור לבסיס הנתונים, וזהו.
בחיים האמיתיים יתכן ונרצה לשמור את ה - context ב - session וכו'.
כדי להוסיף משתמשים חדשים למערכת - אנחנו צריכים לייצר מופע של User - יש לנו שני דרכים, הראשונה עם המתודה הסטטית CreateUser (מתודה שנוצרת בצורה אוטומטית עבור כל מי שיורש מ - EntityObject) והאופצייה השנייה היא לייצר מופע של User ולתת ערכים למאפיינים, בסופו של דבר אנחנו צריכים להוסיף את ה - User שנוצר ל - Users (ל - EntitySet).
החתימה של CreateXXX נוצרת עם כל המאפיינים שאינם nullable, ולכן נכתוב את הקוד הבא
using (EFLabEntities context = new EFLabEntities())
{ User user1 = EntityFrameworkLab.User.CreateUser(1, "shlomo132", "shlomo@gmail.com");
user1.PenName = "shlomi";
context.AddToUsers(user1);
User user2 = new EntityFrameworkLab.User()
{ Id = 2,
Name = "noam",
Gender = UserGender.Male,
Email = "noam@gmail.com",
PenName = "noami"
};
context.AddToUsers(user2);
context.SaveChanges();
}
אחרי שהקוד ירוץ יתווספו לבסיס הנתונים שני משתמשים חדשים.
כמה נקודות:
אחרי שיצרנו את המופע של User אנחנו צריכים להוסיך אותו ל - EntitySet (במקרה שלנו Users), בסוף התהליך צריך לזכור לעשות SaveChanges כדי לשמור את הנתונים לבסיס הנתוניםץ
אין משמעות למאפיין Id (עבור פעולות insert) אפשר לתת לו כל ערך (אפשר אפילו להתעלם ממנו - ולא לתת לו שום ערך) היות שזה מוגדר כמספר רץ הוא יקבל מיד אחרי ה - SaveChanges את המספר הנכון (וכמובן זה יעדכן את האובייקט עם המספר הנכון), אפשר אפילו להוסיף מתודה סטטית עבור CreateXXX ל - partial כדי לוותר על ה - Id
public partial class User
{
public static User CreateUser(string name, string email)
{ return CreateUser(0, name, email);
}
}
דרך אגב יש באג ב - EF, במקרה ששדה מוגדר בבסיס הנתונים כ - NULL אבל בסכמה זה הוגדר (ידנית כמובן) כ - NOT NULL - המערכת תאפשר לייצר אובייקטים ולשמור אותם בבסיס הנתונים מבלי להתריע אבל ברגע שהנתונים ישלפו מבסיס הנתונים האפליקצייה תעוף ויצטרכו לעדכן ידנית את הנתונים בבסיס הנתונים, ולכן מומלץ להשתמש מה שיותר במתודת CreateXXX שמכריחה להכניס לכל מה שהוגדר כ - NOT NULL ערכים.