从 EF Core 中的 ChangeTracker 获取实体类型

问题描述 投票:0回答:1

在 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()

谢谢你。

c# entity-framework
1个回答
0
投票

以下方法对我有用

Entry.Entity.GetType()

选择

e => e.Entity.GetType()
而不是
e => e.Metadata

注意:这对性能不利

© www.soinside.com 2019 - 2024. All rights reserved.