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

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

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

db.SaveChange() לא עובד..

מתוזמן נעוץ נעול הועבר ארכיון code613m
7 פוסטים 2 כותבים 400 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי אפשרות לעריכת פרטים של אנשי קשר
    ופתאום זה לא עובד.. (כבר איזה שבוע.. אני לא זוכר מתי בדיוק זה התחיל..)
    העניין הוא שאני מדבג והכל לכאו' עובד טוב..
    חוץ מזה שכנראה המתודה savechange לא עושה את העבודה.. ולכן אח"כ שכשטוענים את הנתונים מהדטהבייס זה טוען את הנתונים הישנים.

    הנה הקוד:

    public static async Task<DonorVM> SaveChangeFromDonorVMToDB(DonorVM donorVM)
            {
                var db = new DonorsContext();
                Donor donor = await db.Donors.Where(x => x.Id == donorVM.Id).FirstOrDefaultAsync();
                // שימוש בספריה AutoMapper
                var config = new MapperConfiguration(cfg => cfg.CreateMap<DonorVM, Donor>());
                var mapper = config.CreateMapper();
                donor = mapper.Map<Donor>(donorVM);
    
                db.SaveChanges();
                //משמש לצורך בדיקה האם השינויים נשמרו
                var d = db.Donors.Where(x => x.Id == donorVM.Id).FirstOrDefault();
                string s = d.FirstName;
                return donorVM;
            }
    

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

    פורסם במקור בפורום CODE613 ב31/03/2016 13:00 (+03:00)

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

      אתה טוען את הdonnor מהDB בהתחלה, לשם מה? בפועל אתה דורס אותו אח"כ עם אובייקט חדש לגמרי (mapper.Map<Donor>(donorVM) - זה מחזיר חדש).
      כשאתה עושה SaveChanges, האנטיטי מנותק מהdb. שנרי מה שמחובר זה הdonnor הישן שנדרס מזה כבר.

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

      mapper.Map(donorVM, donor);
      

      שורה זו מחליפה את שורה 8.

      פורסם במקור בפורום CODE613 ב31/03/2016 14:57 (+03:00)

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

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

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

        @דוד ל.ט.

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

        mapper.Map<Donor>(donorVM, donor);
        

        שורה זו מחליפה את שורה 8.

        תודה רבה!
        אבל זה לא נותן לי.. זה כותב את השגיאה:

        cannot convert from 'AppDonation.DAL.Models.Donor' to 'System.Action<AutoMapper.IMappingOperationOptions>'
        

        גם לא הבנתי מה שכתבת למה זה לא עובד... בגלל שדרסתי את האובייקט של האנטיטי באובייקט של הmapper?
        @דוד ל.ט.

        אתה טוען את הdonnor מהDB בהתחלה, לשם מה? בפועל אתה דורס אותו אח"כ עם אובייקט חדש לגמרי (mapper.Map<Donor>(donorVM) - זה מחזיר חדש).

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

        פורסם במקור בפורום CODE613 ב31/03/2016 15:08 (+03:00)

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

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

          לא מבין מה לא הבנת. אתה טוען את המקור מהDB אכן לשם אחזור הנתונים המקוריים ושינוי רק אלו שהשתנו. אבל בקריאה לMap כפי שעשית אתה יוצר Donnor חדש!! לא זה שטענת מהDB וללא שום מאפיין מהDB.
          ובנוסף, וזה העיקר (כי אחרת זה היה מעדכן ללא השדות המקוריים אבל עדיין מעדכן), הקשר בין הdb לdonnor המקורי (שזה ע"י שהוא מחזיק refernce אליו) לא מתייחס לאובייקט החדש שיצרת ע"י הMap אלא לישן, שפעם ישן במשתנה donnor אבל המשתנה הזה כבר לא נאמן לו...

          פורסם במקור בפורום CODE613 ב31/03/2016 15:25 (+03:00)

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

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

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

            עכשיו אני רואה שאם אני משתמש בקוד הישן זה כן עובד..
            הקוד הוא כך:
            public static async Task<DonorVM> SaveChangeFromDonorVMToDB(DonorVM donorVM)
            {
            var db = new DonorsContext();
            Donor donor = await db.Donors.Where(x => x.Id == donorVM.Id).FirstOrDefaultAsync();

                        // שימוש בספריה AutoMapper
                        Mapper.CreateMap<DonorVM, Donor>();
                        donor = Mapper.Map<DonorVM, Donor>(donorVM, donor);
            
                        await db.SaveChangesAsync(); 
                        //משמש לצורך בדיקה האם השינויים נשמרו
                        var d = db.Donors.Where(x => x.Id == donorVM.Id).FirstOrDefault();
                        string s = d.FirstName;
                        return donorVM;
                    }
            

            השינוי הוא בשורות 7-8, ובמצב הזה הוא כן שומר את הנתונים.. למרות שלכאו' אני דורס את האובייקט של אנטיטי, לא?
            או שמא יש הבדל איך המתודות של הmapper עובדות?
            אני שיניתי את הקוד לגרסא הקודמת שלו, כיון שהקוד הזה נותן לי את האזהרה:

            'Mapper.CreateMap<TSource, TDestination>()' is obsolete: 'Dynamically creating maps will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed, or Mapper.Initialize. Use CreateMapper to create a mapper

            פורסם במקור בפורום CODE613 ב31/03/2016 15:26 (+03:00)

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

              תקרא טוב את הודעתי והכל יובן.

              פורסם במקור בפורום CODE613 ב31/03/2016 15:27 (+03:00)

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

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

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

                @דוד ל.ט.

                תקרא טוב את הודעתי והכל יובן.

                מעולה!! אכן זה עובד!!
                והעיקר שהחכמנו על הדרך!!

                פורסם במקור בפורום CODE613 ב31/03/2016 15:43 (+03:00)

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

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

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

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