Entity Framework – Part 5

17 בנובמבר 2009

תגיות: , , ,
9 תגובות

 


אז בפרק האחרון דברנו על מה ה – 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 ערכים.

 

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

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

כתיבת תגובה

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

9 תגובות

  1. עידו10 בדצמבר 2009 ב 15:47

    שאלה.
    מה יותר נכון לעשות?
    לבנות Entity Framework אחד לכל בסיס הנתונים או כמה ישויות (Entity Frameworks)ולחלק את בסיס הנתונים שינוהל על על פי ישויות אלו, לדוגמא, ניהול של users נבנה Entity Framework של users וכן הלאה.
    תודה

    הגב
  2. shlomo10 בדצמבר 2009 ב 17:44

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

    אני יכול להניח שרק במידה ובבסיס הנתונים יש טבלאות שלא קשורות אחד לשני בכלל – זה יהיה חכם לחלק לכמה מודלים

    הגב
  3. קובי28 בדצמבר 2009 ב 11:45

    היי, אחלה תרגיל.

    עד היום השתמשתי ב TypedDataset שהוא נתן לי פתרון למצב של offline.

    יש מצב להגדיר את ה EF שיעבוד בצורה כזו, במקום כל הזמן לתשאל את בסיס הנתונים על ידי LINQ?

    ניסיתי לבצע select על QbjectQuery ובכך לשמור את הנתונים במצב offline. אבל זה לא נראה לי נכון.

    יכול להיות שחסר לי משהו בסיסי?

    תודה

    הגב
  4. Shlomo28 בדצמבר 2009 ב 12:04

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

    הגב
  5. דוד11 בפברואר 2010 ב 21:38

    יש לי מערכת שצריכה לעבהוד מול כמה גרסאות שונות של אותו DB (כלומר אצל לקוח אחד יש לנו גרסא א' של DB ואילו אצל לקוח ב' יש לנו גרסא ב' של אותו DB – ההבדלים הם בעיקר בשדות). האם EF יכול לתת מענה לגישה לשני (ואפילו יותר) הDB השונים

    הגב
  6. שירה25 באוקטובר 2011 ב 15:12

    הי

    יש לי בעיה הוא לא מכיר לי את ה- using ? ושאלה נוספת אני רוצה לעבוד עם Visual Wab Gui האם ידוע לך על אתר שמדגים?

    הגב
  7. Shlomo25 באוקטובר 2011 ב 17:24

    כדי שיכיר את ה – using צריך להוסיף reference ל – System.data.entity

    הגב
  8. דוד2 ביוני 2013 ב 6:51

    איך עוברים בין החלקים השונים שיעורי ה- Entity Framework ? אין כל לינק שמאגד את כל ההדרכה של נושא זה ?

    הגב
    1. Serisier27 בנובמבר 2013 ב 15:59

      שאלות:
      1. יש לי DB קיים שמשרת מערכת אחת עם SP וכו, עכשו אני מפתח, מערכת אחרת שמשתמשת באותו DB, רציתי לעבוד עם Entity Frameworks , מה שקורה שברגע שאני מייבאת את ההטבלאות לMODEL שלי הוא מיצר entity בשם הטבלאות והעמודות, אפשר לשנות את זה?ניסתי להוסיף הגדרה של TABLE בentities.edmx
      אבל זה לא נשמר ולא ממש עבד לי.
      2. יש לי הרבה פונקציונליות להוסיף לאוביקט , הכל אמור להיות בpartial?
      3.המערכת שלי נותנת שרותים ללקוחות, ואני רוצה לחשוף להם את האוביקטים שלי, זה נכון לחשוף את ה partial class, אני מפחדת שזה יעשה לי בעיות בעתיד, ואם אני אעבוד עם שתי אובקיטים אחד שלי ואחד של entities , אני מאבד משו , נכון?
      די חדשה בתחום, אשמח לתגובה, תודה

      הגב