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

להגיב על eli לבטל

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

3 תגובות

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

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

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

    מעולה, תודה

    הגב