EF Core - ChangeTracker.DetectChanges получить значение из определенного свойства - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно получить значение свойства из отношения в ChangeTracker EF.

У меня есть класс:

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 получить свойство Nome изTipoClienteInfo

Мой ContextClass:

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());
    }
}

Я думаю, что использовать атрибут, улучшение, но не работает.

1 Ответ

1 голос
/ 24 апреля 2019

Вы можете получить значения свойств из ссылок (здесь: ClienteInfo.TipoCliente) с помощью запроса, подобного этому:

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

Из вашего вопроса не ясно, что именно вы хотите делать с этими значениями, но это должно привести вас на правильный путь.

Есть несколько способов использовать это более динамически и добавлять переменные / параметры, например:

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

var values = ChangeTracker.Entries<ClienteInfo>()
                  .Select(e => e.Reference(referenceName)
                                .TargetEntry.CurrentValues[propertyName])
                  .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...