Entity Framework – Part 4

4 בנובמבר 2009

תגיות: , , ,
3 תגובות

 


בפרק הקודם ראינו את ה – xml שנוצר מאחורי הקלעים והבנו מה המשמעות של האלמנטים ואיך הוא מקשר בין המבנה של בסיס הנתונים לבין מבנה האובייקטים.

 

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

 

תזכורת: יש לנו ישות אחת שנראת כך:

ישות

 

כשפתחנו את קובץ ה – edmx ב – xml editor ראינו שהוא למעשה קובץ xml.

לקובץ הזה יש קובץ נוסף שנקרא Model.Designer.cs – כשנפתח אותו נראה הרבה קוד – ונסביר אותו.

 

החלק הראשון הוא מחלקה שיורשת מ – ObjectContext

 



public partial class EFLabEntities : ObjectContext


{


    public EFLabEntities() :


            base("name=EFLabEntities", "EFLabEntities")


    {


        this.OnContextCreated();


    }


 


    partial void OnContextCreated();


 


    public ObjectQuery<User> Users


    {


        get


        {


            if ((this._Users == null))


            {


                this._Users = base.CreateQuery<User>("[User]");


            }


            return this._Users;


        }


    }


    private ObjectQuery<User> _Users;


 


    public void AddToUsers(User user)


    {


        base.AddObject("Users", user);


    }


}


 

אותו אובייקט שיורש מ – ObjectContext הוא מאוד חשוב – למעשה כל העבודה שלנו מול בסיס הנתונים היא דרכו – בפרקים הבאים כשנתחיל לכתוב קוד מול ה – EF, נראה שהוא שומר לנו על המצב של האובייקטים והוא יודע האם להפעיל Update/Delete/Insert בהתאם למצב של האובייקט.

 

בתוך המחלקה יש לנו כמה בנאים (השמטתי כמה מהם) שיודעים לייצר את ה – Context שלנו –

בזמן יצירת ה – Context יש קריאה למתודה OnContextCreated (מוגדרת מיד אחרי הבנאי) שכברירת מחדל לא עושה כלום, אבל נוכל להרחיב את המחלקה (היות שהיא מוגדרת כ – partial) ולדאוג שיהיה מימוש למתודה.

לדוגמא – תוכלו להוסיף קובץ חדש לפרויקט ובתוכו הקוד הבא:

 



public partial class EFLabEntities


{


    partial void OnContextCreated()


    {


        if (HttpContext.Current.Application["CountOfContextCreated"] == null)


        {


            HttpContext.Current.Application["CountOfContextCreated"] = 0;


        }


 


        int count = (int)HttpContext.Current.Application["CountOfContextCreated"];


        count++;


        HttpContext.Current.Application["CountOfContextCreated"] = count;


    }


}


 

ובכל פעם שמישהו ייצר מופע של ה – Context המתודה שלנו תופעל ונוכל לספור את כמות ה – Context שנוצרו.

 

(מי שלא מכיר את הנושא של partial יכול לקרוא עליו כאן.)

 

 

נמשיך:

אחרי הבנאי והמתודה OnContextCreated יש לנו מאפיין בשם Users

אם אתם זוכרים בפרקים הקודמים כל הזמן דברנו על EntitySet למעשה המאפיין Users הוא ייצוג של ה – EntitySet (אוסף של User)

 

המאפיין הזה הוא בעצם מופע של אובייקט שנראה כך:

 



private ObjectQuery<User> _Users;


 

ObjectQuery הוא אובייקט שיודע לייצר שאילתות מתוך המודל – למעשה ה – EntitySet הוא אוסף של כל ה – Users כשהדרך להביא את הנתונים זה על ידי Query שיביא את כל הנתונים וזה נראה כמו ושראינו למעלה

 



this._Users = base.CreateQuery<User>("[Users]");


 

הפרמטר ששולחים ב – CreateQuery היא מחרוזת שמתארת את השאילתא – במקרה שלנו זה השם של ה – EntitySet שיביא לנו את כל הנתונים (יתורגם ל משהו בסגנון Select * From user)

 

 

בסוף יש לנו מתודה להוספת  User ל – EntitySet (פעולת Insert) (קריאה למתודה לא מכניסה את האובייקט לבסיס הנתונים אלא מוסיפה אותו ל – EntitySet ומסמנת אותו כאובייקט שצריך להפעיל עליו insert

 



public void AddToUsers(User user)


{


    base.AddObject("Users", user);


}


 

 

אחרי ההגדרה של ה – EFLabEntities יש לנו הגדרה של כל הישויות שלנו (כרגע רק User) הוא נראה כך (אני מציג רק חלק ממנו)

 



[EdmEntityType(NamespaceName="EFLabModel", Name="User")]


[DataContract(IsReference=true)]


[Serializable]


public partial class User : EntityObject


{


 


    public static User CreateUser(long id, string name, string email)


    {


        User user = new User();


        user.Id = id;


        user.Name = name;


        user.Email = email;


        return user;


    }


 


    [EdmScalarProperty(EntityKeyProperty=true, IsNullable=false)]


    [DataMember]


    public long Id


    {


        get


        {


            return this._Id;


        }


        set


        {


            this.OnIdChanging(value);


            this.ReportPropertyChanging("Id");


            this._Id = StructuralObject.SetValidValue(value);


            this.ReportPropertyChanged("Id");


            this.OnIdChanged();


        }


    }


    private long _Id;


    partial void OnIdChanging(long value);


    partial void OnIdChanged();


 


    [EdmScalarProperty(IsNullable=false)]


    [DataMember()]


    public string Name


    {


        get


        {


            return this._Name;


        }


        set


        {


            this.OnNameChanging(value);


            this.ReportPropertyChanging("Name");


            this._Name = StructuralObject.SetValidValue(value, false);


            this.ReportPropertyChanged("Name");


            this.OnNameChanged();


        }


    }


 


    private string _Name;


    partial void OnNameChanging(string value);


    partial void OnNameChanged();


}


 

יש את ההגדרה של class בשם User (למעשה הוא Entity) יש לו Attributes של EntityFramework שממפים אותו ל – EntityType המתאים.

כמו כן יש לו Attributes שקשורים ל – WCF.

 

לאחר מכן יש מתודה סטטית בשם CreateUser שמקבלת כפרמטרים את כל המאפיינים שהוגדרו כ – Nullable=false (כלומר כל המאפיינים שחייבים לתת להם ערך) הפונקצייה תייצר מופע של User ותחזיר אותו.

לאחר מכן יש הגדרה של כל המאפיינים – לכל מאפיין יש Attributes של EF שמגדירים אותו – למעשה ההגדרות שאנחנו מגדירים בחלון המאפיינים במודל מוגדרים ב – xml ובקוד המחולל ל – atributes.

 



[EdmScalarProperty(EntityKeyProperty=true, IsNullable=false)]


[DataMember]


public long Id


{


    get


    {


        return this._Id;


    }


    set


    {


        this.OnIdChanging(value);


        this.ReportPropertyChanging("Id");


        this._Id = StructuralObject.SetValidValue(value);


        this.ReportPropertyChanged("Id");


        this.OnIdChanged();


    }


}


 

המאפיין Id מקבל את ה – Attribute ScalaProperty עם הגדרות שזה ה – key שלנו, ועוד.

בחלק ה – set של המאפיין אנחנו מפעילים קריאה לכל מיני מתודות של הודעות שהמאפיין הולך להשתנות או אחרי שהוא השתנה.

את מתודות ה – OnIdChanging ו – OnIdChnaged הם מתודות partial שאנחנו יכולים להרחיב.

 

 

תודה לעידו על התמיכה

 

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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

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

3 תגובות

  1. יוסי גולדברג9 בנובמבר 2009 ב 14:43

    חן חן.
    אגב שליחת השאילתא ל CreateQuary השם "users" עם ה "s" בסוף מתייחס לשם הטבלה או לאובייקט?

    הגב
  2. דובי11 בנובמבר 2009 ב 14:44

    מעולה, תודה

    הגב