c# - 使用特定数据跟踪数据库插入

标签 c# asp.net sql-server entity-framework

我正在维护 ASP.NET MVC 应用程序,它通过 Entity Framework 与 MS SQL 数据库对话。

一段时间以来,我们一直在观察实体更新或插入特定字段为空的数据库的情况。

此字段可能为空,但我们强烈怀疑大多数情况不应发生。我想 Hook 一些调试代码来记录此类尝试的所有实例。

问题是我不知道,我应该在哪里做。

  • 在代码中很多地方插入和更新实体;
  • 我可能会覆盖其 DBSet 后代的 Insert 和 Update 方法,但我不会捕获间接引起的更改(例如通过从数据库中检索实体,更改它并调用 SaveChanges() ) .

我可以在哪里放置代码,以便能够访问特定实体上对数据库的所有写入修改?

最佳答案

我相信您正在寻找 DbContextChangeTracking 属性。

我使用类似的方法通过捕获已更改/添加/删除的内容来构建实体的历史记录。

为此,您可以在 DbContext 中覆盖 SaveChanges() 方法,然后拦截正在更改的条目。

请务必在覆盖结束时调用 base.SaveChanges(); 以实际保存任何更改。

例如,假设您的 DbContext 名为 MyAppDbContext

public partial class MyAppDbContext : DbContext
{
    public override int SaveChanges()
    {
         ChangeTracker.Entries().ToList().ForEach(entry =>
        {

            // entry, here, is DbEntityEntry.
            // it will allow you to see original and new values,
            // such as entry.OriginalValues
            // and entry.CurrentValues
            // You can also find its type
            // entry.Entity.GetType()


            switch (entry.State)
            {
                case EntityState.Detached:
                    break;
                case EntityState.Unchanged:
                    break;
                case EntityState.Added:
                    break;
                case EntityState.Deleted:
                    break;
                case EntityState.Modified:
                    break;
            }
        });

       // call the base.SaveChanges();
       base.SaveChanges();    
    }

}

关于c# - 使用特定数据跟踪数据库插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43112810/

相关文章:

c# - 将特定异常作为默认值传递

c# - 如何使用 Entity Framework 自动设置 DateUpdated 列?

sql-server - 使用 SSDT 2016 部署报告会生成错误

sql-server - 经典ASP-SQL错误停止码,从不显示

c# - 前面不能有数字的子字符串的正则表达式

c# - 有没有一种简单的方法可以验证数据库模式是否正是我期望它使用 Entity Framework 的方式?

c# - 如何加载特定版本的程序集

javascript - 如何使用 jquery 隐藏/显示 <panel>?

c# - 为什么从网络共享读取文件时会出现 UnauthorizedAccessException?

sql - SQL 服务器查询中的 NULL 值