Question

Chaque table de ma base de données a 2 colonnes à la fin, ce qui permet une journalisation (utilisateur qui a effectué l'action et la date de l'action). EDIT: I Utilisez le code - Premières migrations.
Je voudrais donc que ces deux colonnes de journalisation soient remplies automatiquement:

  1. Chaque fois que j'insère une nouvelle entrée dans ma table (à l'aide de dBContext. [Modèle] .Ajouter (entrée))

  2. ou Chaque fois que je fais une action dbcontext.Savechanges ()


  3. J'ai envisagé de remplacer la méthode dbcontext.savechanges () , mais cela n'a pas fonctionné ...

    J'ai également essayé de remplacer la méthode DBSet Ajouter () , pour effectuer l'action de remplissage de journal. Pour cela, j'ai créé une classe CustomDBSet qui hérite de DBSet:

    public class CustomDbSet<TEntity> : DbSet<TEntity> where TEntity : class
        {
            public TEntity Add(TEntity entity)
            {
                //Do logging action here
                return base.Add(entity);
            }
        }
    

    mais cela ne l'a pas fait ni.

    edit: Que se passe-t-il avec cette CustomDBSet est que tout dBContext. [Modèle] renvoie NULL, maintenant (au lieu d'être rempli avec le contenu de la table de base de données)

    J'ai déjà la méthode de l'extension qui fera l'action forestière, mais je ne sais pas où la mettrai de la liste de journalisation deviendrait une action "automatique".

    public static void EntityLogCreate<T>(this T model, string userName) where T : LogColumns
    {
        model.Create_User = userName;
        model.Create_Date = DateTime.Now;
    }
    

    aucune idée pour atteindre cela?

Était-ce utile?

La solution

Voici un exemple de comment le faire.

public class AppContext : DbContext
{
    public DbSet<Item> Items { get; set; }
    public override int SaveChanges()
    {
        int actionById = 1; // Need a way to get the user who does the action.
        DateTime actionDate = DateTime.Now;
        var entries = ChangeTracker.Entries<IAuditLog>();
        foreach (var entry in entries)
        {
            if (entry.State != EntityState.Added && entry.State != EntityState.Modified) continue;
            // Only added and modified entries.
            entry.Entity.ActionById = actionById;
            entry.Entity.ActionDate = actionDate;
        }
        return base.SaveChanges();
    }
}
public interface IAuditLog
{
    int? ActionById { get; set; }
    DateTime? ActionDate { get; set; }
}
public class Item : IAuditLog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ActionById { get; set; }
    public DateTime? ActionDate { get; set; }
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top