我正在维护 ASP.NET MVC 应用程序,它通过 Entity Framework 与 MS SQL 数据库对话。
一段时间以来,我们一直在观察实体更新或插入特定字段为空的数据库的情况。
此字段可能为空,但我们强烈怀疑大多数情况不应发生。我想 Hook 一些调试代码来记录此类尝试的所有实例。
问题是我不知道,我应该在哪里做。
- 在代码中很多地方插入和更新实体;
- 我可能会覆盖其 DBSet 后代的 Insert 和 Update 方法,但我不会捕获间接引起的更改(例如通过从数据库中检索实体,更改它并调用
SaveChanges()
) .
我可以在哪里放置代码,以便能够访问特定实体上对数据库的所有写入修改?
最佳答案
我相信您正在寻找 DbContext
的 ChangeTracking
属性。
我使用类似的方法通过捕获已更改/添加/删除的内容来构建实体的历史记录。
为此,您可以在 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/