目录

EF记录数据变更方法

目录

在使用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))
			{
				//记录
			}
	}
}