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

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

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

שגיאה מוזרה באנטיטי

מתוזמן נעוץ נעול הועבר ארכיון code613m
15 פוסטים 2 כותבים 1.1k צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי
    #2

    השגיאה הראשונה הגיונית מאוד, אתה טען מDB אחד, משאיר אותו חי (הוא לא עובר Dispose) ומחיל Stateים לDB אחר.

    השגיאה השניה פחות מובנת לי. זה נראה שיש מפתח ראשי ידני, או שדה עם אילוץ ייחודיות.

    מה בעצם הקלט של המשתמש שלכן אתה עושה שמירה כ"כ ענפה, עריכה או הוספה של קטגוריות, ו/או comminic?

    פורסם במקור בפורום CODE613 ב14/11/2017 07:40 (+02:00)

    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    תגובה 1 תגובה אחרונה
    2
    • A מנותק
      A מנותק
      avr416
      כתב ב נערך לאחרונה על ידי
      #3

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

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

      אין לי מושג מה לעשות..

      פורסם במקור בפורום CODE613 ב14/11/2017 09:00 (+02:00)

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

        יש מצב שאתה מעלה את גוף המתודה MapAllObjUIToDAL?
        אגב, הref פה לכאורה מיותר כי זה בכל מקרה reference type.

        פורסם במקור בפורום CODE613 ב14/11/2017 09:22 (+02:00)

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        1
        • A מנותק
          A מנותק
          avr416
          כתב ב נערך לאחרונה על ידי
          #5

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

          Standard disconnectedStandard = null;
          
          using (var context = new SchoolDBEntities())
          {
              context.Configuration.ProxyCreationEnabled = false;
          
              disconnectedStandard = context.Standards.Where(s => s.StandardId == 58).Include(s => s.Teachers).FirstOrDefault<Standard>();
          }
          //Update Standard in disconnected mode
          disconnectedStandard.StandardName = "Edited Standard Name";
                      
          //Update teachers collection by editing first teacher and adding new teacher
          disconnectedStandard.Teachers.ElementAt(0).TeacherName = "Edited Teacher Name";
          disconnectedStandard.Teachers.Add(new Teacher() { TeacherName = "New Teacher", StandardId = disconnectedStandard.StandardId });
          
          using (var newContext = new SchoolDBEntities())
          {
              //mark standard based on StandardId
              newContext.Entry(disconnectedStandard).State = disconnectedStandard.StandardId == 0 ? EntityState.Added : EntityState.Modified;
          
              //mark teacher based on StandardId
              foreach (Teacher tchr in disconnectedStandard.Teachers)
                  newContext.Entry(tchr).State = tchr.TeacherId == 0 ? EntityState.Added : EntityState.Modified;
                          
                          
              newContext.SaveChanges();
          }
          

          כן, זה גוף המתודה:

          public static U MapAllObjUIToDAL<T,U>(T objUI,ref U objDAL)
                  {
                      
                      var mapper = reverseConfig.CreateMapper();
          
                      mapper.Map<T,U>(objUI,objDAL);
                   
                      return objDAL;
                  }
          

          תודה רבה!

          פורסם במקור בפורום CODE613 ב14/11/2017 09:27 (+02:00)

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

            אכן, הנקודה היא שלא עשיתי dispose

            הוספתי את השורות הבאות וזה עובד טוב!

            db.Dispose();
            db = new ContactModel();
            

            אם כי לא ברור לי מדוע צריך לאתחל אותו מחדש..

            פורסם במקור בפורום CODE613 ב14/11/2017 09:32 (+02:00)

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

              ברור שזה יעבוד... אבל זה לא נכון!

              עכ"פ שתי השגיאות לדעתי קשורים לזה שיש יותר מAddress אחד, ואילו אתה מתייחס רק לראשון. אז ממה נפשך, אם זה אותו קונטקסט, אז יש בעיה של ניסיון שינוי הID (כי נעשה בו שינויים ע"י הMAP - הוא כנראה במצע SET גם למאפיינים זהים) ואם זה קונקסט חדש, הרי זה נחשב EntityState.Added, בעוד יש להם כבר ID קיים ולכן נעשה נסיון לשים איבר כפול בDB (ואם לא ביטלת את הישן יש גם בעיה של שתי קונטקסטים לאותו אלמנט).

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

              foreach (var a in donor.Addresses)
              	db.Entry(a).State = EntityState.Unchanged;
              

              עם איזה מחלקת mapper אתה משתמש?
              ושאלה שממש בוערת במקרה הזה, איך הmapper יודע מה שורה קיימת ומה חדשה בליסטים של הכתובות והקטגוריות??

              פורסם במקור בפורום CODE613 ב14/11/2017 09:42 (+02:00)

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              תגובה 1 תגובה אחרונה
              0
              • A מנותק
                A מנותק
                avr416
                כתב ב נערך לאחרונה על ידי
                #8

                @דוד ל.ט.

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

                foreach (var a in donor.Addresses)
                	db.Entry(a).State = EntityState.Unchanged;
                

                אז לא... זה לא עובד :?
                נותן עדיין את אותה השגיאה, למרות שאפי' הוספתי במחלקות של הDAL את האטריביוט

                [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
                

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

                פורסם במקור בפורום CODE613 ב14/11/2017 20:23 (+02:00)

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

                  @avr416

                  זה נשמע לי כמו באג באנטיטי..

                  אתה כתבת את זה ברצינות?
                  @דוד ל.ט.

                  המילה באג נאמרת לדעתי ברוב המקרים כתירוץ לאי לקיחת אחריות על בעיה שלא מוצאים לה שורש (כתבתי על זה פה http://tchumim.com/post/8965).

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

                  פורסם במקור בפורום CODE613 ב14/11/2017 20:31 (+02:00)

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #10

                    אהה, עוד שאלה, לפני השורה הראשונה של הקוד הראשון, מתרחש משהו עם המופע db?

                    פורסם במקור בפורום CODE613 ב14/11/2017 20:38 (+02:00)

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    תגובה 1 תגובה אחרונה
                    0
                    • A מנותק
                      A מנותק
                      avr416
                      כתב ב נערך לאחרונה על ידי
                      #11

                      הDB הוא סטטי למחלקה, והפונקציה סטטית, ואני לא מאתחל אותו בכל קריאה.

                      public static class MapObjToUI
                          {
                              static Model db = new Model();
                      

                      כנ"ל הmapper הוא משתנה סטטי, של המחלקה:

                      static MapperConfiguration config = new MapperConfiguration(cfg => {
                                  cfg.CreateMap<Donor, DonorVM>();
                                  cfg.CreateMap<Address, ContactAddressVM>();
                                  cfg.CreateMap<Category, CategoryVM>();
                                  cfg.CreateMap<Communication, CommunicationVM>();
                                  cfg.CreateMap<Setting, SettingVM>();
                              });
                      

                      פורסם במקור בפורום CODE613 ב14/11/2017 21:34 (+02:00)

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

                        סטטי לDbContext ועוד בווב זה רעיון גרוע מאוד. אין ספק שהבעיה נעוצה בזה.
                        אם אין לך כח להצהיר (כשזה כמה וכמה מתודות), תצהיר ברמת הקונטרולר [u:wv98m2jv]לא סטטי[/u:wv98m2jv], ותממש בקונטרולר IDispsable ובמתודת Dispose תסגור את המופע של הקונטקסט.
                        להגיד שהבנתי את השגיאה? לא לגמרי.

                        פורסם במקור בפורום CODE613 ב14/11/2017 21:54 (+02:00)

                        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                        תגובה 1 תגובה אחרונה
                        0
                        • A מנותק
                          A מנותק
                          avr416
                          כתב ב נערך לאחרונה על ידי
                          #13

                          @דוד ל.ט.

                          סטטי לDbContext ועוד בווב זה רעיון גרוע מאוד. אין ספק שהבעיה נעוצה בזה.
                          אם אין לך כח להצהיר (כשזה כמה וכמה מתודות), תצהיר ברמת הקונטרולר [u:23k0yp2q]לא סטטי[/u:23k0yp2q], ותממש בקונטרולר IDispsable ובמתודת Dispose תסגור את המופע של הקונטקסט.
                          להגיד שהבנתי את השגיאה? לא לגמרי.

                          מזל שיש אותך!!
                          שיניתי.. אבל זה עדיין זורק את אותה השגיאה <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) -->

                          פורסם במקור בפורום CODE613 ב14/11/2017 21:57 (+02:00)

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

                            @avr416

                            @דוד ל.ט.
                            סטטי לDbContext ועוד בווב זה רעיון גרוע מאוד. אין ספק שהבעיה נעוצה בזה.

                            אם אין לך כח להצהיר (כשזה כמה וכמה מתודות), תצהיר ברמת הקונטרולר [u:3s3pc33d]לא סטטי[/u:3s3pc33d], ותממש בקונטרולר IDispsable ובמתודת Dispose תסגור את המופע של הקונטקסט.
                            להגיד שהבנתי את השגיאה? לא לגמרי.

                            מזל שיש אותך!!
                            שיניתי.. אבל זה עדיין זורק את אותה השגיאה <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) -->

                            טוב כעת תורך לענות על השאלות האחרות.

                            פורסם במקור בפורום CODE613 ב14/11/2017 21:58 (+02:00)

                            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                            תגובה 1 תגובה אחרונה
                            0
                            • A מנותק
                              A מנותק
                              avr416
                              כתב ב נערך לאחרונה על ידי
                              #15

                              טוב, אז כפי שדוד העריך הבעיה היא בשילוב של הmapper (במקרה שלנו השתמשתי בספרייה automapper) עם הORM - דהיינו ה entityframework.

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

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

                              תודה לדוד על העזרה!

                              פורסם במקור בפורום CODE613 ב14/11/2017 23:32 (+02:00)

                              תגובה 1 תגובה אחרונה
                              1
                              תגובה
                              • תגובה כנושא
                              התחברו כדי לפרסם תגובה
                              • מהישן לחדש
                              • מהחדש לישן
                              • הכי הרבה הצבעות


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

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

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