我为服务器中的每个操作实现了一个审核日志(添加,修改和删除)。问题出现在修改过的,因为我审核了每个被修改的属性,但是我不想审计一些属性。例如:时间戳或其他。 这就是我做的,并且工作正常: 1)我在DBContext中创建了另一个SaveChanges()方法 2)
if (dbEntity.State == EntityState.Modified)
{
foreach (string propertyName in dbEntity.OriginalValues.PropertyNames)
{
if (!Equals(dbEntity.OriginalValues.GetValue<object>(propertyName), dbEntity.CurrentValues.GetValue<object>(propertyName)))
{
var log = new AuditLogDetailEntity()
{
Timestamp = timestamp,
Type = "M", // Modified
EntityName = tableName1,
PrimaryKeyValue = Convert.ToInt32(dbEntity.CurrentValues.GetValue<object>(primaryKeyName)),
PropertyName = propertyName,
OldValue = dbEntity.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntity.OriginalValues.GetValue<object>(propertyName).ToString(),
NewValue = dbEntity.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntity.CurrentValues.GetValue<object>(propertyName).ToString()
};
changesCollection.Add(log);
}
}
}`
这是一个提取代码,而不是所有功能。 我可以在里面进行验证,询问我不想审核的字段,但是,有没有更彻底的方法呢?也许在类中添加一些数据注释或其他东西.. 感谢。
答案 0 :(得分:0)
您可以使用[System.ComponentModel.DataAnnotations.Schema.NotMapped]属性。
答案 1 :(得分:0)
您可以创建自定义属性
foreach (string propertyName in dbEntity.OriginalValues.PropertyNames)
{
if(!dbEntity.Entity.GetType().GetCustomAttributes(typeof(UnMappedAttribute), true).Any())
{
continue;
}
if (!Equals(dbEntity.OriginalValues.GetValue<object>(propertyName), dbEntity.CurrentValues.GetValue<object>(propertyName)))
{
//.....
}
}
然后检查每个属性是否有它
>>> a = raw_input("What is your favourite colour?")
What is your favourite colour?5
>>>
>>> b = ['c{}'.format(i) for i in range(1, int(a)+1)]
>>> b
['c1', 'c2', 'c3', 'c4', 'c5']