我试图覆盖SaveChanges()
类中的DbContext
方法,这是因为我尝试获取实体的名称,其中添加了行,删除或更新了行的相应ID并采取了行动。
我不知道该怎么做。
这与日志操作有关。
提前问候。
答案 0 :(得分:4)
您需要覆盖DbContext的SaveChanges方法,并使用ChangeTracker跟踪实体在保存到database.public之前所做的更改
public class ChangeLog
{
public string EntityName { get; set; }
public string PropertyName { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
}
public override int SaveChanges()
{
var modifiedEntities = ChangeTracker.Entries()
.Where(p => p.State == EntityState.Modified).ToList();
foreach (var change in modifiedEntities)
{
var entityName = change.Entity.GetType().Name;
foreach(var prop in change.OriginalValues.PropertyNames)
{
var originalValue = change.OriginalValues[prop].ToString();
var currentValue = change.CurrentValues[prop].ToString();
if (originalValue != currentValue)
{
ChangeLog log = new ChangeLog()
{
EntityName = entityName,
PropertyName = prop,
OldValue = originalValue,
NewValue = currentValue,
};
ChangeLogs.Add(log);
}
}
}
return base.SaveChanges();
}
在上面的代码片段中,我们查询了更改跟踪器api以获取已修改的实体
var modifiedEntities = ChangeTracker.Entries()
.Where(p => p.State == EntityState.Modified).ToList();
您可以查询添加和删除的实体。
<强> 修改 强>
object GetPrimaryKeyValue(DbEntityEntry entry)
{
var stateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
return stateEntry.EntityKey.EntityKeyValues[0].Value;
}
注意:如果您将“标识符插入”设置为“开”,那么对于上面添加的实体,代码段将不起作用。