ASP MVC / EF6 - Lancement automatique
-
21-12-2019 - |
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).
Je voudrais donc que ces deux colonnes de journalisation soient remplies automatiquement:
-
Chaque fois que j'insère une nouvelle entrée dans ma table (à l'aide de dBContext. [Modèle] .Ajouter (entrée))
-
ou Chaque fois que je fais une action dbcontext.Savechanges ()
public class CustomDbSet<TEntity> : DbSet<TEntity> where TEntity : class
{
public TEntity Add(TEntity entity)
{
//Do logging action here
return base.Add(entity);
}
}
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?
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; }
}