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



  • אני רוצה לעשות לוג שינויים ב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 עצמו. (הקוד נמצא בשיתופייה כאן לדעתי)
    אני לא משתממש בזה כי זה לא עוזר לי כאן.
    אני רוצה לשמור את המשתמש ושאר ירקות, ואת זה אין לי שם.

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


 

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