C# 审核覆盖 SaveChanges() 方法。如何从表中找出实体的外键及其值

标签 c# .net asp.net-mvc entity-framework overriding

我正在覆盖 SaveChange() 方法。我想要的是将对实体所做的所有更改记录到数据库中的简单文本,如“abc updated Name john to doe, ...”等 我已经实现了这个功能,但是当一个实体中有一个外键要像 country_Id 那样更新时,它指出表 Country 它生成像“abc updated Country_Id 1 to 3, ...”这样的文本,这就是我不想要的像这样“abc 将国家/地区加拿大更新为澳大利亚,...”

因此,要实现这一点,它应该知道外键及其值

我的代码是:

 public override int SaveChanges()
    {
        List<string> listChanges = new List<string>();
        List<string> listTable = new List<string>();

        var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
        IEnumerable<ObjectStateEntry> changes =
            objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted);


        foreach (ObjectStateEntry stateEntryEntity in changes)
        {

            var modifiedProperties = stateEntryEntity.GetModifiedProperties();
            foreach (var propName in modifiedProperties)
            {
                if (Convert.ToString(stateEntryEntity.OriginalValues[propName]) != Convert.ToString(stateEntryEntity.CurrentValues[propName]))
                {
                    listTable.Add(stateEntryEntity.EntityKey.EntitySetName);
                    listChanges.Add(propName + " From " + Convert.ToString(stateEntryEntity.OriginalValues[propName]) + " to " + Convert.ToString(stateEntryEntity.CurrentValues[propName]));

                }


                //System.Console.WriteLine("Property {0} changed from {1} to {2}",
                //     propName,
                //     stateEntryEntity.OriginalValues[propName],
                //     stateEntryEntity.CurrentValues[propName]);
            }
        }
         return base.SaveChanges();
    }

最佳答案

有一个功能可以实现这一点,我使用 changetracker 来跟踪更改和日志。您可以在处理上下文之前正确获取所有更改,因此,您可以像这样简单地构建;

public override int SaveChanges()
        {
            foreach (var history in ChangeTracker.Entries()
                .Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added ||
                                                                 e.State == EntityState.Modified))
                .Select(e => e.Entity as IModificationHistory)
            )
            {
                history.DateModified = DateTime.Now;
                if (history.DateCreated == DateTime.MinValue)
                    history.DateCreated = DateTime.Now;
            }
            var result = base.SaveChanges();
            foreach (var history in ChangeTracker.Entries()
                .Where(e => e.Entity is IModificationHistory)
                .Select(e => e.Entity as IModificationHistory)
            )
                history.IsDirty = false;
            return result;
        }

您还可以在 base.savechanges() 之前指定您的条目

这是我的历史界面

 public interface IModificationHistory
    {
        DateTime DateModified { get; set; }
        DateTime DateCreated { get; set; }
        bool IsDirty { get; set; }
    }

关于C# 审核覆盖 SaveChanges() 方法。如何从表中找出实体的外键及其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920607/

相关文章:

asp.net-mvc - jQuery UI 对话框不会关闭

c# - MVC 5 GetUserId() 返回 null

javascript - 如何在剑道中的单击事件中获取包含复选框的行

c# - TryParse在C#中的应用

javascript - 如何使用 Javascript 在客户端使用 WebMethod 返回的复杂类型?

.net - 在构建服务器上运行 Moles - 有什么想法可以跳过代码生成吗?

c# - 如何在 C# 中将 LinkedList<T> 添加到 LinkedList<T>?

c# - 使用私有(private)还是使用属性? C#

c# - 数据库函数 "cannot be translated into a LINQ to Entities store expression"

c# - SQLite.Net,SQLite 位数据类型的 C# 等效项