2010-07-01 6 views
0

J'ai un EDM (phoneDB) qui modélise une base de données MSSQL back-end. J'ai développé une application ASP.NET (VB) qui permet d'éditer les informations dans cette base de données. Quand quelqu'un modifie une entrée d'enregistrement, j'aimerais enregistrer cette action.Entity Framework: Créer l'historique des modifications

En ce moment, je fais ce qui suit:

Pour Each..Next qui vérifie si l'entrée est un objet qui a eu son modifié EntityState.

et If Not..End Si cela garantit que nous n'avons pas affaire à une entité relationnelle ou à une entité nulle.

Maintenant, c'est là que ça devient flou. Ce que je veux faire, c'est récupérer les informations de ces objets modifiés et les enregistrer dans la base de données. Maintenant, j'ai quelque chose comme ceci:

Dim audit as History 
audit.action = "Changed information in " & propName & " to " & entry.CurrentValues(propName) & " from " & entry.OriginalValues(propName) 
audit.action_by = this_user 
audit.action_date = Date.Now 
audit.extension_id = 

Je suis cependant pas sûr, comment dire à tirer une propriété spécifique d'entrée. Par exemple, je dois obtenir (pseudo-code) quelque chose comme:

audit.extension_id = entry.OriginalValues(extension_id) 

Répondre

0

Voici comment je l'ai accompli à la fin:

Private Shared Sub context_SavingChanges(ByVal sender As Object, ByVal e As EventArgs) 
     ' This allows us to record a history of the changes made by the user to the database. The record is created automatically by EF, but we need to save it to the database 
     ' for permanent retention. 
     For Each entry As ObjectStateEntry In DirectCast(sender, ObjectContext).ObjectStateManager.GetObjectStateEntries(EntityState.Modified) 
      If Not entry.IsRelationship And entry.Entity IsNot Nothing Then 
       For Each propName As String In entry.GetModifiedProperties() 
        Dim context As New AppsEntities() 
        Dim audit As New History 
        audit.action_note = "Changed information in " & propName & " to " & entry.CurrentValues(propName) & " from " & entry.OriginalValues(propName) 
        audit.action_by = CStr(HttpContext.Current.Session("person_name")) 
        audit.action_date = Date.Now 
        audit.extension_id = entry.CurrentValues.GetValue(0) 
        context.AddToHistories(audit) 
        context.SaveChanges() 
       Next 

      End If 

     Next 
    End Sub 
1

Je ne comprends pas ce que vous entendez par « tirer une propriété spécifique d'une entrée »? Le (pseudo) code que vous avez écrit ne dit pas grand-chose, qu'est-ce qu'un extesion_id dans votre cas? Si extension_id est un nom de propriété d'une entité, alors vous obtenez sa valeur d'origine en appelant entry.OriginalValues ​​("extension_id"), mais je suis à peu près certain que vous le saviez. Btw, vous pouvez effectuer un enregistrement d'historique complexe dans la base de données en utilisant des déclencheurs sans même que la couche de données le sache. C'est un truc assez vieux et travaille vite, voir this