優しくしてください。初めての投稿なので、用語が正しく理解できていない場合は申し訳ありません。
で、監査コードEntity Framework
を書く必要があります。
データベースを継承するコンテキストクラスがありますDbContext
。
および各エンティティのSetInitializer
Myです。DbSets
また、監査を行っている SaveChanges のオーバーライドもあります。
監査には、 None、Basic、およびAllPropertiesの 3 つのレベルがあり、各エンティティには異なるプロパティが割り当てられています。この場合、AllProperties 監査を実行しようとしています。
これは、修正された各プロパティの新しいレコードを書き込むために foreach でEntityState.Modified
使用している場所で機能しますGetModifiedProperties
しかし、 for で同じことを行うのに問題があります。ループできる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()
});
}
誰でも助けることができますか?