要温柔,这是我的第一篇文章,如果我第一次没有得到正确的术语,那就很抱歉。
在Entity Framework
中,我需要编写一些审核代码。
我有一个继承DbContext
的上下文类,它有我的数据库。
每个实体SetInitializer
和我的DbSets
。
我还在进行审计的覆盖SaveChanges。
有3个级别的审核,无,基本和 AllProperties ,每个实体都分配了不同的属性,在这种情况下我正在尝试进行AllProperties审核。
这适用于EntityState.Modified
我在foreach中使用GetModifiedProperties
为每个属性修改的新记录
但是我在为EntityState.Added
做同样的事情时遇到了麻烦,似乎没有可以循环的等效GetNewProperties
。
case AuditType.AllProperties:
{
if (entry.State == EntityState.Modified)
{
foreach (var propertyName in entry.GetModifiedProperties()
.Where(propertyName => propertyName != "Id" && propertyName != "RowVersion"))
{
var original = entry.OriginalValues;
var oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString();
var current = entry.CurrentValues;
var newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString();
//if (oldValue != newValue) // probably not necessary
//{
AuditTrails.Add(new AuditTrail
{
DomainId = domainId,
Controller = "",
Action = "",
EntityType = entry.Entity.GetType().Name,
EntityId = entityId,
Property = propertyName,
Before = oldValue,
After = newValue
});
}
}
else
{
AuditTrails.Add(new AuditTrail
{
DomainId = domainId,
Controller = "",
Action = "",
EntityType = entry.Entity.GetType().Name,
EntityId = entityId,
EntityValue = entry.Entity.ToString(),
Property = "",
Before = "",
After = entry.State.ToString()
});
}
有人可以帮忙吗?
答案 0 :(得分:0)
每当您致电entry.OriginalValues
时,您都可以访问PropertyNames
属性,该属性会为您提供所有属性的列表。因为这是一个新的条目,所以无论如何它们都是新的。
答案 1 :(得分:0)
以下现在适用于我
if (entry.State == EntityState.Added)
{
for (var i = 0; i < entry.CurrentValues.FieldCount; i++)
{
var propertyName = entry.CurrentValues.DataRecordInfo.FieldMetadata[i].FieldType.Name;
if (propertyName == "Id") continue;
if (propertyName == "RowVersion") continue;
AuditTrails.Add(new AuditTrail
{
DomainId = domainId,
Controller = "",
Action = entry.State.ToString(),
EntityType = entityType,
EntityId = entityId,
EntityValue = "", //entityValue,
Property = propertyName,
Before = "",
After = entry.CurrentValues[i].ToString(),
});
}
}