在 DBContext 上调用
SaveChanges()
时,我需要知道添加、修改或删除了哪些实体。为此,我有以下方法:
private IDictionary<string, List<Type>> GetChangedEntityTypes()
{
var changes = new Dictionary<string, List<Type>>();
foreach (var state in new[] { EntityState.Added, EntityState.Modified, EntityState.Deleted })
{
var metadataOfAffectedTypes = ChangeTracker
.Entries()
.Where(e => e.State == state)
.Select(e => e.Metadata);
var typesAffected = metadataOfAffectedTypes.Select(m => m.ClrType);
changes.Add(state.ToString(), typesAffected.ToList());
}
return changes;
}
我从
SaveChanges()
的覆盖中调用它,如下所示:
var changedTypes = GetChangedEntityTypes();
var saveResult = base.SaveChangesAsync(cancellationToken);
if (changedTypes.Any(e => e.Value.Any()))
{
OnEntitiesChanged(new EntitiesChangedEventArgs(changedTypes));
}
return saveResult;
我遇到的问题是实体元数据上的
ClrType
属性。有时这是实体的实际类型,有时则不是(在某些情况下它显示为 Dictionary<string, object>
)。有没有办法从变更跟踪器中可靠地获取实体的类型?
我正在使用最新的 EF Core,并在启动文件中启用了
UseLazyLoadingProxies()
。
谢谢你。
以下方法对我有用
Entry.Entity.GetType()
选择
e => e.Entity.GetType()
而不是 e => e.Metadata
注意:这对性能不利