
Attach לאובייקט שהקונטקסט כבר מכיר.Attach לאובייקט עם אותו ID, התוכנית קורסת.The instance of entity type Gift cannot be tracked because another instance with the same key value for Id is already being tracked. כלומר הקונטקסט כבר מכיר את האובייקט, שומר עליו ועוקב אחריו.Attach ואז מוחקים ו-SaveChanges.using), לבצע פעולה אחת וסגור אותו. אם צריך גם להציג וגם למחוק, מפצלים לשתי פונקציות שלכל אחת קונטקסט משלה. זה קורה בלחיצה על כפתור באפליקציית חלונות או בפונקציה בשרת שניגשת למסד, וכל פעם הקונטקסט נקי ממידע קודם.Attach למידע שכבר קיים, ויכול לבחור בשיטה הנכונה.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר מעמיק על Context Entity Framework Core» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
חשוב להבין שיש מגבלות כלשהן או איסורים אפשר לקרוא לזה בעבודה עם הקונטקסט. בואו נבין רגע על מה מדובר. אנחנו מקודם מחקנו איזושהי רשומה מהדאטאבייס.
בואו נסתכל רגע על הדאטאבייס ונראה שיש לנו כרגע מתנה QtDoll עם ה-ID 1, RedBimba עם ה-ID 2. אני חוזר ומה שאני רוצה לעשות זה למחוק עכשיו את ה-ID 2. אין שום סיבה שאנחנו לא נצליח לעשות את זה.
כלומר, מקודם מחקנו את רשומה מספר 3, אז אפשר למחוק את רשומה מספר 2. אבל בוא נניח ששנייה לפני שאני מבצע את זה, אני לוקח ומביא את המידע מהדאטאבייס אליי. בואו נדביק פה את השורות האלה.
יש לנו כאן גלישה לדאטאבייס והחזרת כל המתנות. בואו נשנה את זה ל-G, כי כבר יש לי כאן את המשתנה גיפט. וואלה מה, אסור לי ללכת ולהביא את המידע שנייה לפני שאני מוחק אותו אז בהחלט מותר להביא את המידע, אבל עכשיו יש בעיה אחרת שתתרחש.
מה שאנחנו מנסים לעשות זה לצרף to attach עם השיטה השנייה, בין אם זה עם עדכון ובין אם זה אם אני מבצע מחיקה. ברגע שאני מבצע attach לאיזשהו אובייקט, אז כמובן אני לא אוכל לעשות את זה אם ה-ID שלו כבר קיים לנו.
בואו נסתכל רגע מה עכשיו יתבצע, מה הקריסה שתתרחש, וכמובן נבין רגע מה בדיוק הבעיה. אז קודם כל אנחנו רואים כאן שהוא מנסה לבצע מחיקה, אבל שנייה לפני זה אנחנו מציגים פה את המידע.
הנה שתי המתנות שיש לנו בדאטאבייס, ואז מה שהוא כותב לנו זה The instance of entry type gift cannot be tracked because another instance with the same key value for ID is already being tracked.
מה זאת אומרת being tracked, זה אומר שכבר צירפנו אותו לקונטקסט והקונטקסט עכשיו מכיר אותו, שומר עליו, עוקב אחריו, הוא בקש של הקונטקסט. ואז הוא ממשיך.
When attaching existing entities, ensure that only one entity instance with a given key value is attached. זאת אומרת, אם אתה מבצע attach, אז אתה לא יכול לעשות את זה במידה וכבר יש לך איזשהו אובייקט עם אותו ה-ID.
מה אנחנו למדים מהנקודה הזאת? דבר ראשון, מה שאנחנו רואים זה את הייחודיות של המפתחות. ID, אנחנו הגדרנו אותו כמפתח ראשי. הקונטקסט כמובן שומר על יוניקיות של מפתחות ראשיים, של פריימרי קיז. הוא יודע כזה דבר, יש לו רשימת מתנות, לכל אובייקט יש מפתח ראשי, המפתח הראשי חייב להיות יוניקי.
אם אני עושה לו איזשהו attach לאובייקט עם מפתח ראשי שכבר קיים לו שמה, אז הוא אומר לי, רגע, אתה מנסה מה, להוסיף אחד חדש? הוא כבר קיים לי, אתה לא יכול להוסיף אותו.
אתה רוצה אולי לעדכן? אין בעיה, אם אתה רוצה לעדכן, אז הוא כבר קיים לי. אל תוסיף לי אותו, הוא כבר נמצא לי בקולקשן.
זה אומר שהקונטקסט קודם כל עוקב אחרי יוניקיות של מפתחות. דבר נוסף שאנחנו רואים פה, ושמותר היה לנו לעבוד עם הטכניקה הראשונה של עדכון במקרה כזה, כי הבאנו כבר את כל המתנות, אנחנו יכולים פשוט לעדכן איזושהי מתנה שכבר נמצאת כאן.
זאת אומרת שיש לנו את השיטה הראשונה, אנחנו גם רואים שאנחנו לא רוצים לערבב בין שתי השיטות האלה. אנחנו לא גם מביאים בשיטה הראשונה מתנה, ואז מעדכנים אותה בשיטה השנייה עם ה-touch.
לא עושים דבר כזה. אנחנו בוחרים שיטה ועובדים איתה. או שאנחנו מביאים את המידע בין אם להביא את הכל ובין אם להביא מתנה בודדת, ואז מעדכנים בשיטה הראשונה שלמדנו, שאנחנו לא מביאים בכלל ואז מבצעים Attach כאן, יוצרים אובייקט, מבצעים לו Attach ואז מותר