db.SaveChange() לא עובד..
-
יש לי אפשרות לעריכת פרטים של אנשי קשר
ופתאום זה לא עובד.. (כבר איזה שבוע.. אני לא זוכר מתי בדיוק זה התחיל..)
העניין הוא שאני מדבג והכל לכאו' עובד טוב..
חוץ מזה שכנראה המתודה 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)
-
אתה טוען את הdonnor מהDB בהתחלה, לשם מה? בפועל אתה דורס אותו אח"כ עם אובייקט חדש לגמרי (mapper.Map<Donor>(donorVM) - זה מחזיר חדש).
כשאתה עושה SaveChanges, האנטיטי מנותק מהdb. שנרי מה שמחובר זה הdonnor הישן שנדרס מזה כבר.מה עליך לעשות? במבט ראשון לעדכן במקום ליצור חדש, שזה ניתן ע"י שמעבירים למתודה map גם את המופע הקיים:
mapper.Map(donorVM, donor);
שורה זו מחליפה את שורה 8.
פורסם במקור בפורום CODE613 ב31/03/2016 14:57 (+03:00)
-
@דוד ל.ט.
מה עליך לעשות? במבט ראשון לעדכן במקום ליצור חדש, שזה ניתן ע"י שמעבירים למתודה 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)
-
תיקנתי את הודעתי (צריך להעביר שתי ארגומנטי גנריק אחד לסורס ואחד ליעד, אבל בלי כלום זה עובד הכי פשוט :).
לא מבין מה לא הבנת. אתה טוען את המקור מהDB אכן לשם אחזור הנתונים המקוריים ושינוי רק אלו שהשתנו. אבל בקריאה לMap כפי שעשית אתה יוצר Donnor חדש!! לא זה שטענת מהDB וללא שום מאפיין מהDB.
ובנוסף, וזה העיקר (כי אחרת זה היה מעדכן ללא השדות המקוריים אבל עדיין מעדכן), הקשר בין הdb לdonnor המקורי (שזה ע"י שהוא מחזיק refernce אליו) לא מתייחס לאובייקט החדש שיצרת ע"י הMap אלא לישן, שפעם ישן במשתנה donnor אבל המשתנה הזה כבר לא נאמן לו...פורסם במקור בפורום CODE613 ב31/03/2016 15:25 (+03:00)
-
עכשיו אני רואה שאם אני משתמש בקוד הישן זה כן עובד..
הקוד הוא כך:
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)