在使用SQLServer时,通常情况下使用SQLServer自带管理器可以查看到数据变更的记录。如果在程序用需要更灵活的记录这些信息,则可以通过EF的ObjectStateManager属性的相关方法实现。

ObjectStateManager.GetObjectStateEntries 方法

返回具有给定状态的对象或关系的 ObjectStateEntry 对象的集合。

命名空间: System.Data.Objects

程序集: System.Data.Entity(在 System.Data.Entity.dll 中)

语法:

1
2
3
public IEnumerable<ObjectStateEntry> GetObjectStateEntries(
EntityState state
)

参数:

state
类型:System.Data.EntityState

用于筛选返回的 ObjectStateEntry 对象的 EntityState。

返回值:

类型:System.Collections.Generic.IEnumerable

具有给定 EntityState 的 ObjectStateEntry 对象的集合。

备注:

EntityState 是一个位字段,因此,通过对多个 EntityState 值执行按位或操作,在一次调用中即可检索多个状态的状态项。

例如我们需要获取修改过的记录,则

1
entities.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)

获取添加或删除的记录

1
entities.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted)

如果要记录某一个表的某一个字段的变更情况,则需要使用GetModifiedProperties方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = "propertyname"; //需要记录的字段名
foreach (var item in entities.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
{
var table = item.Entity as Table;
if (item.GetModifiedProperties().Contains(str))
{
var index = item.CurrentValues.GetOrdinal(str);
var newValue = item.CurrentValues.GetValue(index);
var oldValue = item.OriginalValues.GetValue(index);
if (!object.Equals(newValue, oldValue))
{
//记录
}
}
}