在DbContext的ChangeTracker中,可以通过Entries方法获取所有修改的数据,然后形成一个数据的List, 方法如下
public static class ContextHelper
{
public static IEnumerable<DbEntityEntry> GetChangedEntries(this DbContext context)
{
return context.ChangeTracker.Entries()
.Where(c => c.State == EntityState.Added || c.State == EntityState.Deleted ||
c.State == EntityState.Modified)
.ToList();
}
public static DatabaseChange SerializeChangedEntry(this DbEntityEntry entry, IUser usr = null)
{
DatabaseChange result = null;
var time = DateTime.Now;
if (entry.State == EntityState.Added)
{
result = new DatabaseChange
{
Id = Guid.NewGuid().ToString(),
DateTime = time,
Ip = usr?.IP,
User = usr?.UserName,
Table = GetTableName(entry.Entity.GetType()),
Action = "Add",
OriginalValues = string.Empty,
CurrentValues = entry.CurrentValues.ToJson(),
};
}
if (entry.State == EntityState.Deleted)
{
result = new DatabaseChange
{
Id = Guid.NewGuid().ToString(),
DateTime = time,
Ip = usr?.IP,
User = usr?.UserName,
Table = GetTableName(entry.Entity.GetType()),
Action = "Delete",
OriginalValues = entry.OriginalValues.ToJson(),
CurrentValues = String.Empty
};
}
if (entry.State == EntityState.Modified)
{
result = new DatabaseChange
{
Id = Guid.NewGuid().ToString(),
DateTime = time,
Ip = usr?.IP,
User = usr?.UserName,
Table = GetTableName(entry.Entity.GetType()),
Action = "Modify",
OriginalValues = entry.OriginalValues.ToJson(),
CurrentValues = entry.CurrentValues.ToJson()
};
}
return result;
}
public static string GetTableName(Type type)
{
return ObjectContext.GetObjectType(type).Name;
}
public static IList<DatabaseChange> GetChanges(this DbContext context)
{
return context.GetChangedEntries()
.Select(c => c.SerializeChangedEntry())
.Where(c=>c!=null)
.ToList();
}
}
其中,定义DatabaseChange如下
public class DatabaseChange
{
public string Id { get; set; }
public DateTime DateTime { get; set; }
public string Ip { get; set; }
public string User { get; set; }
public string Table { get; set; }
public string Action { get; set; }
public string OriginalValues { get; set; }
public string CurrentValues { get; set; }
}