简体   繁体   中英

Entity Framework Audit Trail

I am having issues with my code below. Everything works fine for getting Added and Deleted Entries. I have access to all new data in my modified section, but for some reason I can't get the original values. Any help will be most appreciated

public override int SaveChanges()
    {

        ChangeTracker.DetectChanges(); // Important!

        ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext;

        List<ObjectStateEntry> objectStateEntryList =
            ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added
                                                       | EntityState.Modified
                                                       | EntityState.Deleted)
            .ToList();
        List<Log> LogEntries = new List<Log>();

        foreach (ObjectStateEntry entry in objectStateEntryList)
        {

            if ((!entry.IsRelationship) && (entry.Entity is Scan))
            {
                Log logEntry = new Log();
                JavaScriptSerializer serializer= new JavaScriptSerializer();
                logEntry.TimeStamp = System.DateTime.Now;
                logEntry.Username = "me";
                IEnumerable<string> modifiedProperties = entry.GetModifiedProperties();
                logEntry.ChangedColumns = serializer.Serialize(modifiedProperties);
                logEntry.TableName = entry.EntitySet.Name;

                switch (entry.State)
                {
                    case EntityState.Added:
                        {

                            logEntry.Action = "Added";
                            logEntry.NewValue = serializer.Serialize(entry.Entity);
                            logEntry.OriginalValue = "";

                            // write log...
                            break;
                        }
                    case EntityState.Deleted:
                        {// write log...

                            logEntry.Action = "Deleted";
                            logEntry.NewValue = serializer.Serialize(entry.Entity);
                            logEntry.OriginalValue = "";

                            break;
                        }
                    case EntityState.Modified:
                        {
                            logEntry.NewValue = "{";
                            logEntry.OriginalValue = "{";
                            foreach (string propertyName in
                                         entry.GetModifiedProperties())
                            {
                                DbDataRecord original = entry.OriginalValues;
                                string oldValue = original.GetValue(
                                    original.GetOrdinal(propertyName))
                                    .ToString();

                                CurrentValueRecord current = entry.CurrentValues;
                                string newValue = current.GetValue(
                                    current.GetOrdinal(propertyName))
                                    .ToString();
                                logEntry.NewValue += "\"" + propertyName + "\":\"" + newValue + "\",";
                                logEntry.OriginalValue += "\"" + propertyName + "\":\"" + oldValue + "\",";
                            }
                            logEntry.NewValue = logEntry.NewValue.TrimEnd(',') + "}";
                            logEntry.OriginalValue = logEntry.OriginalValue.TrimEnd(',') + "}";
                            break;
                        }
                }
                LogEntries.Add(logEntry);

            }
        }
        foreach (Log addLog in LogEntries)
        {
            this.Logs.Add(addLog);
        }
        return base.SaveChanges();



    }

查看这篇文章 ,作者提到他的第一种方法无法插入,并且他做了一些修改。

You might want to check out the AuditDBContext project on Codeplex. http://auditdbcontext.codeplex.com/

The author stores on update or delete the new values along with the old is saved with other details such as the user who committed the action, timestamp etcetera.

The source code for this project will show you how to get the old values.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM