我正在覆盖 SaveChange() 方法。我想要的是将对实体所做的所有更改记录到数据库中的简单文本,如“abc updated Name john to doe, ...”等 我已经实现了这个功能,但是当一个实体中有一个外键要像 country_Id 那样更新时,它指出表 Country 它生成像“abc updated Country_Id 1 to 3, ...”这样的文本,这就是我不想要的像这样“abc 将国家/地区加拿大更新为澳大利亚,...”
因此,要实现这一点,它应该知道外键及其值
我的代码是:
public override int SaveChanges()
{
List<string> listChanges = new List<string>();
List<string> listTable = new List<string>();
var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
IEnumerable<ObjectStateEntry> changes =
objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted);
foreach (ObjectStateEntry stateEntryEntity in changes)
{
var modifiedProperties = stateEntryEntity.GetModifiedProperties();
foreach (var propName in modifiedProperties)
{
if (Convert.ToString(stateEntryEntity.OriginalValues[propName]) != Convert.ToString(stateEntryEntity.CurrentValues[propName]))
{
listTable.Add(stateEntryEntity.EntityKey.EntitySetName);
listChanges.Add(propName + " From " + Convert.ToString(stateEntryEntity.OriginalValues[propName]) + " to " + Convert.ToString(stateEntryEntity.CurrentValues[propName]));
}
//System.Console.WriteLine("Property {0} changed from {1} to {2}",
// propName,
// stateEntryEntity.OriginalValues[propName],
// stateEntryEntity.CurrentValues[propName]);
}
}
return base.SaveChanges();
}
最佳答案
有一个功能可以实现这一点,我使用 changetracker 来跟踪更改和日志。您可以在处理上下文之前正确获取所有更改,因此,您可以像这样简单地构建;
public override int SaveChanges()
{
foreach (var history in ChangeTracker.Entries()
.Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added ||
e.State == EntityState.Modified))
.Select(e => e.Entity as IModificationHistory)
)
{
history.DateModified = DateTime.Now;
if (history.DateCreated == DateTime.MinValue)
history.DateCreated = DateTime.Now;
}
var result = base.SaveChanges();
foreach (var history in ChangeTracker.Entries()
.Where(e => e.Entity is IModificationHistory)
.Select(e => e.Entity as IModificationHistory)
)
history.IsDirty = false;
return result;
}
您还可以在 base.savechanges() 之前指定您的条目
这是我的历史界面
public interface IModificationHistory
{
DateTime DateModified { get; set; }
DateTime DateCreated { get; set; }
bool IsDirty { get; set; }
}
关于C# 审核覆盖 SaveChanges() 方法。如何从表中找出实体的外键及其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920607/