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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. אנטיטי: change.OriginalValues מחזיר את אותו ערך של change.CurrentValues

אנטיטי: change.OriginalValues מחזיר את אותו ערך של change.CurrentValues

מתוזמן נעוץ נעול הועבר תכנות
1 פוסטים 1 כותבים 244 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • clickoneC מנותק
    clickoneC מנותק
    clickone
    כתב ב נערך לאחרונה על ידי clickone
    #1

    אני רוצה לעשות לוג שינויים בDB.
    הORM הוא EF והשפה היא C#.

    מצאתי כמה דוגמאות.
    כולם בכיוון של זה:
    https://exceptionnotfound.net/entity-change-tracking-using-dbcontext-in-entity-framework-6/

    רק מה, 2 השורות האלו:

                var originalValue = change.OriginalValues[prop].ToString();
                var currentValue = change.CurrentValues[prop].ToString();
    

    מחזירות את אותו ערך, למרות שהערך בוודאות השתנה.
    מדובר על EF DB First אבל שהכל נשאר בDB.
    מה שנקרא ef db design
    ולכן הקוד נמצא בpartial class

    הנה הקוד המלא (אל תתייחסו לזה שאין הכנסה לDB בסוף, כי עדיין לא יצרתי את הטבלה בDB)

        public class ChangeLog
        {
            public int Id { get; set; }
            public string EntityName { get; set; }
            public string PropertyName { get; set; }
            public string PrimaryKeyValue { get; set; }
            public string OldValue { get; set; }
            public string NewValue { get; set; }
            public DateTime DateChanged { get; set; }
        }
        public partial class Entities : DbContext
        {
            public override int SaveChanges()
            {
                var modifiedEntities = ChangeTracker.Entries()
                    .Where(p => p.State == EntityState.Modified).ToList();
                var now = DateTime.UtcNow;
    
                foreach (var change in modifiedEntities)
                {
                    var entityName = change.Entity.GetType().Name;
                    var primaryKey = GetPrimaryKeyValue(change);
    
                    foreach (var prop in change.OriginalValues.PropertyNames)
                    {
                        var originalValue = change.OriginalValues[prop].ToString();
                        var currentValue = change.CurrentValues[prop].ToString();
                        if (originalValue != currentValue)
                        {
                            ChangeLog log = new ChangeLog()
                            {
                                EntityName = entityName,
                                PrimaryKeyValue = primaryKey.ToString(),
                                PropertyName = prop,
                                OldValue = originalValue,
                                NewValue = currentValue,
                                DateChanged = now
                            };
                            //ChangeLogs.Add(log);
                        }
                    }
                }
                return base.SaveChanges();
            }
            object GetPrimaryKeyValue(DbEntityEntry entry)
            {
                var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
                return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
            }
    
            //protected override void OnModelCreating(DbModelBuilder modelBuilder)
            //{
            //    //omitted for brevity
            //}
        }
    

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

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

    אין טסט כמו פרודקשן.

    המייל שלי urivpn@gmail.com

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

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

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

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