J'ai un modèle d'entité qui a des informations d'audit sur toutes les tables (50+ tables)Étendre le type de base et mettre à jour automatiquement les informations d'audit sur l'entité
CreateDate
CreateUser
UpdateDate
UpdateUser
Actuellement nous informations d'audit mise à jour programatically.
Ex:
if(changed){
entity.UpdatedOn = DateTime.Now;
entity.UpdatedBy = Environment.UserName;
context.SaveChanges();
}
Mais je suis à la recherche d'une solution plus automatisée. Au cours des sauvegardes, si une entité est créée/mise à jour, je voudrais mettre à jour automatiquement ces champs avant de les envoyer à la base de données pour le stockage.
Toute suggestion sur la façon dont je pourrais le faire? Je préférerais ne faire aucune réflexion, donc l'utilisation d'un modèle de texte n'est pas hors de question.
Une solution a été proposée pour surcharger SaveChanges et le faire là, mais pour ce faire je devrais soit utiliser la réflexion (dans laquelle je ne veux pas faire) ou dériver une classe de base. En supposant que je descends cette route, comment pourrais-je y parvenir?
Par exemple
EXAMPLE_DB_TABLE
CODE
NAME
--Audit Tables
CREATE_DATE
CREATE_USER
UPDATE_DATE
UPDATE_USER
Et si je crée une classe de base
public abstract class IUpdatable{
public virtual DateTime CreateDate {set;}
public virtual string CreateUser { set;}
public virtual DateTime UpdateDate { set;}
public virtual string UpdateUser { set;}
}
L'objectif final est de pouvoir faire quelque chose comme ...
public overrride void SaveChanges(){
//Go through state manager and update audit infromation
//FOREACH changed entity in state manager
if(entity is IUpdatable){
//If state is created... update create audit.
//if state is updated... update update audit
}
}
Mais je Je ne suis pas sûr de savoir comment je vais générer le code qui permettrait d'étendre l'interface.
Ce n'est pas vraiment une réponse directe, mais j'ai fait quelque chose de similaire avec LINQ to SQL. Consultez mon article http://farm-fresh-code.blogspot.com/2009/05/auditing-inserts-and-updates-using-linq.html. Cela pourrait vous donner quelques idées. L'idée de base est d'étendre le contexte de données et de surcharger SubmitChanges et d'y effectuer le travail d'audit. Mes informations d'audit sont stockées dans une table différente et je vérifie à la fois le succès et l'échec de sorte qu'il utilise un contexte distinct, mais vous pouvez toujours en avoir quelques idées. – tvanfosson
Merci. Je cherchais à faire des trucs générateurs de code en utilisant des fichiers .tt, mais j'espérais quelque chose de plus simple, je le lirais mal ce soir et je reviendrais vers vous. – Nix