2009-09-03 9 views
1

Après avoir passé par Entity Framework, j'ai quelques questions sur la mise en œuvre de l'audit dans Entity Framework.Audit dans Entity Framework

Je souhaite stocker chaque valeur de colonne créée ou mise à jour dans une table d'audit différente.

  1. En ce moment je fais appel SaveChanges (false) pour enregistrer les enregistrements dans la base de données (encore les changements dans le contexte est pas remis à zéro). Ensuite, obtenez le ajouté | enregistrements modifiés et boucle à travers le GetObjectStateEntries. Mais ne sais pas comment obtenir les valeurs des colonnes où leurs valeurs sont remplies par proc stocké. ie, createdate, modifieddate etc.

  2. Voici l'exemple de code sur lequel je travaille.

    // Get the changed entires(ie, records) 
    IEnumerable<ObjectStateEntry> changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
    
    // Iterate each ObjectStateEntry(for each record in the update/modified collection) 
    foreach (ObjectStateEntry entry in changes) 
    { 
        // Iterate the columns in each record and get thier old and new value respectively 
        foreach (var columnName in entry.GetModifiedProperties()) 
        { 
         string oldValue = entry.OriginalValues[columnName].ToString(); 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, oldvalue, newvalue 
        } 
    } 
    
    changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
    
    foreach (ObjectStateEntry entry in changes) 
    { 
        if (entry.IsRelationship) continue; 
        var columnNames = (from p in entry.EntitySet.ElementType.Members 
             select p.Name).ToList(); 
    
        foreach (var columnName in columnNames) 
        { 
         string newValue = entry.CurrentValues[columnName].ToString(); 
    
         // Do Some Auditing by sending entityname, columnname, value 
        } 
    } 
    
+0

Il est pas très clair ce que vous cherchez exactement ici- qu'est-ce que vous voulez faire que vous je ne sais pas comment faire –

+0

Je veux faire de l'audit (en insérant le nom de table/nom de l'entité, nom de la colonne, valeur dans la table d'audit quand des changements sont faits pour une entité donnée) –

Répondre

1

Ici vous avez deux options de base:

  • le faire au niveau de la base de données
  • Est-ce que dans le code C#

Le faire à la base de données niveau, signifie utiliser des déclencheurs. Dans ce cas, il n'y a pas de différence si vous utilisez une bibliothèque d'entreprise ou une autre technologie d'accès aux données. Pour le faire dans le code C#, vous devez ajouter une table de journal à votre modèle de données et écrire les modifications dans la table de journal. Lorsque vous sauvegardez, les modifications apportées aux données et les informations que vous avez écrites dans la table de journalisation sont enregistrées.

0

Est-ce que vous insérez le nouvel enregistrement en utilisant un proc stocké? Si ce n'est pas le cas (par exemple, si vous créez un objet, définissez des valeurs, insérez sur submit et sauvegardez les modifications, le nouvel identifiant d'objet sera automatiquement chargé dans la propriété id de l'objet que vous avez créé. alors vous devez renvoyer l'IDENTITÉ @@ du proc comme une valeur de retour

EX:.

StoreDateContext db = new StoreDataContext(connString); 
Product p = new Product(); 
p.Name = "Hello Kitty Back Scratcher"; 
p.CategoryId = 5; 
db.Products.Add(p); 
try 
{ 
    db.SaveChanges(); 
    //p.Id is now set 
    return p.Id; 
} 
finally 
{ 
    db.Dispose; 
}