What does each thing do in this method? (Mirror Audit in the Entity Framework)

2

Well, following this great Gypsy answer , where he implements a Mirror Audit , where the following method is implemented in DbSaveChanges() :

//Laço de repetição em ChangeTracker.Entries. Mas o que é ele? 
foreach (var entidade in ChangeTracker.Entries())
{
    // ** É possível explicar de forma sucinta o que está acontecendo aqui?
    var tipoTabelaAuditoria = entidade.GetType().GetInterfaces()[0].GenericTypeArguments[0];
    var registroTabelaAuditoria = Activator.CreateInstance(tipoTabelaAuditoria);

    // Isto aqui é lento, mas serve como exemplo. 
    // Depois procure trocar por FastMember ou alguma outra estratégia de cópia.
    // ** E aqui ?
    foreach (var propriedade in entidade.GetType().GetProperties())
    {
        registroTabelaAuditoria.GetType()
                               .GetProperty(propriedade.Name)
                               .SetValue(registroTabelaAuditoria, entidade.GetType().GetProperty(propriedade.Name).GetValue(entidade, null));
    }

    /* Salve aqui usuário e data */
    this.Set(registroTabelaAuditoria.GetType()).Add(registroTabelaAuditoria);

Well, I left in comments in the code where I have questions, but I leave here some questions in order to objectify the question further.

What is ChangeTracker.Entries() ?

What does this line var tipoTabelaAuditoria = entidade.GetType().GetInterfaces()[0].GenericTypeArguments[0]; ?

Here, I know that it is taking the properties of the types in the properties, but if possible explain in a better way.

foreach (var propriedade in entidade.GetType().GetProperties())
{
    registroTabelaAuditoria.GetType()
          .GetProperty(propriedade.Name)
          .SetValue(registroTabelaAuditoria, entidade.GetType().GetProperty(propriedade.Name).GetValue(entidade, null));
}
    
asked by anonymous 21.04.2017 / 18:59

1 answer

2
  

What is ChangeTracker.Entries ()?

It is the entities that the context has noticed that have some change in relation to the original registry of the database.

  

What does this line var tipoTabelaAuditoria = entidade.GetType().GetInterfaces()[0].GenericTypeArguments[0]; ?

This line takes the type of TClasseAuditada declared in the class that implements IEntidade<TClasseAuditada> . For example:

public class MinhaClasse : IEntidade<MinhaClasseAuditoria> { ... }

The return would be the same as typeof(MinhaClasseAuditoria) .

  

Here, I know that it is taking the properties of the types in the properties, but if possible explain in a better way.

Rather, the values of each property of the table being audited, and copying these values to the audit table.

    
21.04.2017 / 19:04