
db.entry(gift).State. אובייקט שהובא מהדאטאבייס נמצא במצב Unchanged.Modified. כשהערך זהה למקורי, המצב נשאר Unchanged. אחרי SaveChanges המצב חוזר ל-Unchanged.Added, Deleted, Detached, Modified ו-Unchanged. אובייקט שנוצר ידנית ולא קשור לקונטקסט הוא Detached.new Gift עם ה-ID הרצוי (4), שם חדש (learning chess), מחיר 40 ו-AgeGroupID 2. בלי הבאה מהדאטאבייס.db.gifts.Attach(gift). המצב הופך ל-Unchanged, ואם שומרים עכשיו לא קורה כלום.db.entry(gift).State = EntityState.Modified ואז SaveChanges. ה-Entity Framework מייצרת שאילתת update, ובדאטאבייס רואים את השינוי.if (!db.gifts.Any(g => g.ID == id)) ולהציג no such gift. הבדיקה מהירה מעט משליפה מלאה, אך היא עדיין גישה לדאטאבייס.הטקסט המלא של הדקות הראשונות בהרצאה «עדכון רשומה - שיטה שניה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו רוצים לראות שיטה נוספת לבצע עדכון ולהבין למה יש שתי שיטות, מה בדיוק הבעיה עם השיטה הראשונה, יתרונות, חסרונות וכדומה.
קודם כל, מה הבעיה עם השיטה הראשונה? הבעיה עם השיטה הראשונה שיש פה פשוט שתי פניות לדטאבייס. כאשר אנחנו רוצים לבצע עדכון, כל מה שאנחנו צריכים לבצע זה לבנות שאילתת Update ולשלוח אותה לדטאבייס.
ככה אנחנו יכולים לבצע את זה בעזרת SQL סטנדרטית. אבל מה שעשינו עכשיו זה שאילתא ראשונה תביא לי את האובייקט, זאת שאילתת סלקט, ואחר כך עשינו עדכון כלשהו, ואז save changes, שאילתה שנייה של update.
זה חיסרון, כי אני לא רוצה לפנות פעמיים לדאטאבייס. היתרון זה שזה מביא לי את האובייקט ואומר לי יש לך פה הכל בצורה פשוטה, אתה לא חייב לעדכן הכל, אתה יכול לעדכן רק חלק.
אני יודע שיש פה דברים שהם כבר קיימים באובייקט. יש עוד יתרונות לשיטה הזאת, אבל כמו שראינו, יש גם את החיסרון. אנחנו רוצים לעשות את זה עם פנייה אחת לדאטאבייס.
אז לצורך כך בואו קודם כל נבין משהו לגבי האובייקט הזה. אנחנו הבאנו אובייקט gift. בואו נניח שהאובייקט הזה קיים, יש לנו פה תעיף, הוא עובר בהצלחה.
ועכשיו מה שכדאי להראות זה משהו שנקרא Entity State של האובייקט הזה. בואו נלך ל-db.entry ופונקציה שאומרת אני אאתר לך איזשהו אובייקט שקיים אצלי והאובייקט צריך להיות קיים.
יכול להיות שהוא קיים, יכול להיות שהוא לא קיים. אנחנו כבר הבאנו אותו ולכן הוא אמור להיות קיים בקולקשן. כל מה שאנחנו מביאים מהדאטאבייס קיים בתוך הקונטקסט. אם לא הבאנו את זה, זה לא קיים בקונטקסט.
אז אני הולך לאנטרי ואני נותן לו את האובייקט gift ואני אומר לו תשמע תגיד לי מה ה-state שלו. ה-state אם אני מסתכל אני רואה שהוא מסוג רואים את זה פה entity.state בואו נריץ את זה כמובן שהוא יעדכן את עצמו והוא יגיד לי Unchanged Unchanged זה אומר עדיין אין לו שינוי וזה
הגיוני כי רק הבאתי אותו מהדאטאבייס אז הוא Unchanged בואו ניקח את השורה הזאת ואחרי שעדכנו רק את ה-Name, נדפיס אותה שוב פעם. נריץ, ומה שהוא יגיד לנו זה Changed.
תשמע, עוד לא עשית בה שום שינוי. היה לך Amazing Children Chess, נשאר Amazing Children Chess. בואו נשים פה שתיים, נריץ, ו-Modified. רגע, רגע, יש לנו פה איזשהו State אחר.
אוקיי, זה Modified, בואו נשנה ל-3 בשביל שנקבל שוב Modified, הבנתי, ונשים את זה אחרי ה-Save Changes, נריץ ויש לנו Unchanged, Modify ושוב פעם Unchanged בגלל ששמרנו לדאטאבייס אז זה מסונכרן עם הדאטאבייס.
קודם כל מעניין לראות שיש כאן איזשהו State של אותו אובייקט ככה אנחנו מגיעים אליו למעשה והוא יכול להיות סדרה של דברים. אם אני כרגע אנסה לראות מה אפשר להכניס לתוכו אז אני אקבל enum שיש לו added, deleted כי יכלנו למחוק את הרשומה, detached זה אומר שרק יצרנו אובייקט ולא חיברנו
אותו לשום מקום, modified ו-unchanged אלה הסטייטים שקיימים לכל אובייקט ב-entity framework שאו שיצרנו אותו מקומית או שהבאנו אותו מהדאטאבייס או שעשינו עליו איזושהי פעולה וכדומה.
בואו רגע נשים את כל אלה רק בהערה, אנחנו לא באמת צריכים אותם בשביל הקוד. נעתיק את הפונקציה הזאת, נשכפל, נקרא לה updateGift2, נשכפל את זה, וזה נשים בהערה, יש לנו updateGift2.
איך אנחנו יכולים לעדכן גיפט בלי ללכת לדאטאבייס פעמיים? בואו ניקח שוב פעם את ID 4, ומה שאנחנו רוצים זה לא להביא את הגיפט מהדאטאבייס.
זאת אומרת, את זה אנחנו לא רוצים לבצע, אז אני מוחק את זה. ביי. איך אני יכול לדעת שבאמת יש לי ארבע? אז אני יכול לבצע איזה בדיקה, אבל בוא נניח שכרגע אני יודע שיש לי את הגיפט מספר ארבע, אז את זה נוריד.
מה שאנחנו רוצים לבצע זה לייצר גיפט בעצמנו. גיפט, גיפט שווה ניו. ונגיד לו ה-ID שלך זה ה-ID הזה, ה-NAME זה בוא נגיד משהו אחר Learning Chess, ה-Price בוא ניתן לו 40 ו-H Group ID בוא ניתן לו 2. Good, עכשיו מה שאנחנו רוצים לעשות אנחנו רוצים לעבוד כאילו על Entity Framework
ולהגיד לעצמי כאילו הבאנו את הדבר הזה מהדאטאבייס תכירי אותו כי ברגע שעשינו את הטכניקה הראשונה אז הבאנו מהדאטאבייס דרך הקונטקסט את אותו גיפט ואז הוא שייך לקונטקסט הוא נשמר בתוך הקונטקסט הזה אז אפשר ללכת ולעדכן אותו.
אם אני יוצר אובייקט משלי הוא מה שנקרא detached הוא לא שייך לדאטאבייס בכלל בואו נציג את הסטייט שלו נוריד את אלה את אלה אנחנו כבר לא צריכים ולפני שאני אעשה save changes אני רק רוצה לראות מה הסטייט של האובייקט החדש הזה.
נריץ ומה שהוא אומר לנו זה detached מה אני לא הגעתי מהדאטאבייס אני לא יודע מאיפה הבאת אותי יצרת סתם איזה אובייקט אני מנותק לגמרי בסדר מה אנחנו רוצים לעשות אנחנו רוצים לעבוד על entity framework ולהגיד לה כאילו שכן הבאנו את האובייקט הזה מהדאטאבייס אז אנחנו באים לdb.gifts.attach בוא תחבר אותו בצורה סינתטית כאילו הבאת אותו מהדאטאבייס הנה הגיף
חבר אותו עכשיו בואו, אחרי שעשינו את זה, נבצע בדיקה של מה ה-state שלו. שימו לב שעדיין לא שמרנו את השינויים בדאטאבייס,