我有以下代码来使用实体框架6记录更改。
目前,它只记录对特定表的更改,但我打算对其进行扩展,以处理任何表。我不确定提取表名的最佳方法。
我在Db.SaveChanges之前调用这段代码。Db是DBContext。
private void LogHistory()
{
var entries = this.Db.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified || e.State == EntityState.Deleted)
.ToList();
foreach (var entry in entries)
{
foreach (string o in entry.CurrentValues.PropertyNames)
{
var property = entry.Property(o);
var currentVal = property.CurrentValue == null ? "" : property.CurrentValue.ToString();
var originalVal = property.OriginalValue == null ? "" : property.OriginalValue.ToString();
if (currentVal != originalVal)
{
if (entry.Entity.GetType().Name.Contains("PropetyPair"))
{
// make and add log record
}
}
}
}
}发布于 2014-01-23 04:39:16
没什么大不了的,但这个:
var currentVal = property.CurrentValue == null?"“:property.CurrentValue.ToString();var originalVal = property.OriginalValue == null?"”:property.OriginalValue.ToString();
可缩短为:
var currentVal = (property.CurrentValue ?? string.Empty).ToString();
var originalVal = (property.OriginalValue ?? string.Empty).ToString();我不确定提取表名的最佳方法。
你不能那么做。您正在查看实体类型的名称--作为一个对象/关系映射器,EF将该实体映射到一个表;如果需要表名,则需要查看该实体的表映射。
我打算扩充它以应付任何一张桌子
如果有一个IEnumerable<Type>,您可以在其中记录所有要记录更改的实体类型,而不是获取该类型的名称并将其与一些神奇的字符串进行比较,您可以只执行_monitoredTypes.Contains(typeof(entry.Entity)) (不是测试,只是一个想法)。
就性能而言,循环太多了:
if (entry.Entity.GetType().Name.Contains("PropetyPair"))这个条件不需要string o,因为它正在关闭entry -因此,您可以将该条件向上移动两个级别,并且只有在实体类型感兴趣时才进入第二个循环。
https://codereview.stackexchange.com/questions/39430
复制相似问题