EF Core - ChangeTracker.DetectChanges 从特定 属性 获取价值

EF Core - ChangeTracker.DetectChanges get value from specific property

我需要从 EF 的 ChangeTracker 中的关系中获取 属性 的值。

我有 class:

public class ClienteInfo
{
    public Guid Id { get; set; }
    public Guid IdTipoCliente { get; set; }
    public string Nome { get; set; }
    public bool Ativo { get; set; }
    public bool Bloqueado { get; set; }

    public virtual TipoClienteInfo TipoCliente { get; set; }
}

public class TipoClienteInfo
{
     public Guid Id { get; set; }
     public string Nome { get; set; }
     public bool Ativo { get; set; }

     public virtual ICollection<ClienteInfo> Clientes { get; set; }
}

要审核日志,在 属性 IdTipoCliente 上获取 属性 TipoClienteInfo 的名称

我的上下文类:

public class DataBaseContext : DbContext
{
    public DbSet<ClienteInfo> Cliente { get; set; }
    public DbSet<TipoClienteInfo> TipoCliente { get; set; }


    public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
    {
        ChangeTracker.DetectChanges();

        foreach (var entry in ChangeTracker.Entries())
        {
            foreach (var property in entry.Properties)
            {
                //GET HERE THE VALUE
            }
        }

        var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
        return result;
    }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        RegisterMaps(modelBuilder);
    }

    public static void RegisterMaps(ModelBuilder builder)
    {
        builder.ApplyConfiguration(new ClienteMaps());
        builder.ApplyConfiguration(new TipoClienteMaps());
    }
}

我想使用属性、反射,但不起作用。

您可以通过如下查询从引用(此处:ClienteInfo.TipoCliente)中获取 属性 个值:

ChangeTracker.Entries<ClienteInfo>()
    .Select(e => e.Reference(c => c.TipoCliente)
                  .TargetEntry.CurrentValues["Nome"])

从你的问题中不清楚你到底想用这些值做什么,但这应该会让你走上正确的轨道。

有几种方法可以更动态地使用它并添加 variables/parameters,例如:

var referenceName = "TipoCliente";
var propertyName = "Nome";

var values = ChangeTracker.Entries<ClienteInfo>()
                  .Select(e => e.Reference(referenceName)
                                .TargetEntry.CurrentValues[propertyName])
                  .ToList();