דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. כיצד לעדכן ישות קיימת בדטה בייס (EF)

כיצד לעדכן ישות קיימת בדטה בייס (EF)

מתוזמן נעוץ נעול הועבר ארכיון code613m
12 פוסטים 4 כותבים 708 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #2

    אתה צריך קודם לקורא לפונקציה Attach
    ורק אחר כך לשנות את הערכים של הרשומה
    ואחר כך לשמור

    פורסם במקור בפורום CODE613 ב25/09/2016 16:17 (+03:00)

    תגובה 1 תגובה אחרונה
    1
    • A מנותק
      A מנותק
      avr416
      כתב ב נערך לאחרונה על ידי
      #3

      כן, אבל הנקודה היא שאינני יודע איזה שדות המשתמש שלח לעדכון.. (שהרי הנקודה שהוא יוכל לעדכן איזה מאפיין שהוא רוצה, בלי לעדכן את כל השדות..)
      ב Microsoft.EntityFrameworkCore.DbSet יש פונקציה הנקראת Update, אולם באנטיטי הרגיל (System.Data.Entity)אין אותה..
      ניסיתי ככה:

      db.Synagogues.Attach(synagogue);
                  var item = await db.Synagogues.FindAsync(id);
                  item = synagogue;           
                           
                  try
                  {
                      await db.SaveChangesAsync();
                  }
      

      אבל זה לא עובד..

      פורסם במקור בפורום CODE613 ב25/09/2016 19:27 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #4

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

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

        פורסם במקור בפורום CODE613 ב25/09/2016 19:55 (+03:00)

        תגובה 1 תגובה אחרונה
        1
        • רחמיםר מנותק
          רחמיםר מנותק
          רחמים מורחק
          כתב ב נערך לאחרונה על ידי
          #5

          וראה כאן איך לחלץ בעצמך את הערכים שהמשתמש הזין בטופס

          פורסם במקור בפורום CODE613 ב25/09/2016 20:02 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #6

            בקוד למעלה שורה 14 היא היפך שורה 16.
            כשיש אובייקט אנטיטי שנטען מהDB הוא "מחובר" לContextDb שטען אותו (כל עוד הוא "חי"). ביצוע שינוי באובייקט הזה מסמן אצל הContextDb שלאנטיטי הזה יש לבצע Update בעת הSaveChanges.
            כמובן שבמידה ואנטיטי בכלל לא נטען ע"י מופע הContextDb (או ממופע אחר מnew רגיל כבדוגמה שלנו - הaps עושה זאת) אז אין לו שום התייחסות ופעולה בעת הSaveChanges. הפעולה db.Synagogues.Attach או השמה של כל ערך ב EntityState ([u:1titfp79]חוץ מUnchanged[/u:1titfp79]), מחברת אנטיטי ממקור זר לDbContext הנוכחי, ומתחילה "לעקוב" אחריו. השמה של הערך Modified מספרת לContextDb שהאנטיטי שונה מהמקור בdb ולכן יש להחיל עליו משפט Update בעת השמירה על אף שלא ישתנה מכאן ולהבא, וזה מה שצריך לעשות במקרה שלך. מאיפה הוא יידע מה לעדכן? הוא לא יידע ויעדכן הכל. ותרגיש בנוח עם זה.
            הערך Unchanged פועל להפך, הוא מנתק קשר בין הDb לבין אנטיטי שנטען על ידו או שקושר אליו באחת המתודות המתוארות לעיל.

            פורסם במקור בפורום CODE613 ב25/09/2016 20:30 (+03:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            2
            • A מנותק
              A מנותק
              avr416
              כתב ב נערך לאחרונה על ידי
              #7

              תודה על ההסבר המפורט!
              הענין הוא שחשבתי שאפשר לשלוח לשרת רק פרמטר אחד והוא יעדכן רק את הפרמטר הזה.
              אבל אני מבין שא"א (בצורה פשוטה, כי אפשר בצורה מסובכת לבדוק איזה פרמטר נשלח ורק אותו לעדכן..) כי ברגע שאני אומר לו לעדכן, אז הוא מעדכן את כל השדות, וכל שאר השדות הערך שלהם null או ריק, וממילא גם הם מתעדכנים..

              פורסם במקור בפורום CODE613 ב25/09/2016 21:50 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #8

                בדוגמאות הרשמיות ואף בסקאפאולדינג הנוצרים דינמית מתבצעת טעינה מהDB לפי הID ורק אז קישור למודל של ערכי הטופס, ראה פה: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application תחת המקטע Update the Edit HttpPost Method.
                בדרך זו המאפיינים שאכן לא שונו לא עוברים עדכון חוזר.

                פורסם במקור בפורום CODE613 ב26/09/2016 07:46 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                1
                • A מנותק
                  A מנותק
                  avr416
                  כתב ב נערך לאחרונה על ידי
                  #9

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

                  If you want the SQL Update statementto update only the fields that the user actually changed, you can save the original values in some way (such as hidden fields) so that they are available when the HttpPost Edit method is called. Then you can create a Student entity using the original values, call the Attach method with that original version of the entity, update the entity's values to the new values, and then call SaveChanges. For more information, see Entity states and SaveChanges and Local Data in the MSDN Data Developer Center.

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

                  פורסם במקור בפורום CODE613 ב26/09/2016 12:40 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #10

                    מעניין מאוד.
                    כי אתמול בדקתי עם EF CORE ומאפיין שלא שונה (אף שהוצב בו הערך שוב!) לא עובר עדכון... ממילא אותו הקוד שבדוגמה שם ייצור משפט SQL כפי שבדיוק נחוץ.
                    כפי הנראה של EF6 אין את היכולת הזו.
                    לגבי מה שהרגעתי על עדכון מיותר של שדות מצאתי פה סימוכין לכך: http://codereview.stackexchange.com/a/37306

                    פורסם במקור בפורום CODE613 ב26/09/2016 14:47 (+03:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    1
                    • א מנותק
                      א מנותק
                      ארכיטקט
                      כתב ב נערך לאחרונה על ידי
                      #11

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

                      פורסם במקור בפורום CODE613 ב26/09/2016 18:20 (+03:00)

                      אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

                      תגובה 1 תגובה אחרונה
                      1
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים מורחק
                        כתב ב נערך לאחרונה על ידי
                        #12

                        אפשר שתגלה לי גם? 😢
                        😉

                        פורסם במקור בפורום CODE613 ב26/09/2016 18:30 (+03:00)

                        תגובה 1 תגובה אחרונה
                        0

                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום