2011-10-17 5 views
0

J'ai une application Web en utilisant EF4. Je suis un peu nouveau pour EF et maintenant essayer de mettre en œuvre le changement Audit.I a essayé de le faire en piégeant l'événement SavingChanges de la classe de contexte comme ci-dessousEntity Framework 4 Change Audit

partial void OnContextCreated() 
     { 
      this.SavingChanges += new EventHandler(TicketContainer_SavingChanges); 

     } 

Ainsi, le gestionnaire d'événements accède aux enregistrements modifiés par le

suivant
this.ObjectStateManager.GetObjectStateEntries(
      EntityState.Added | EntityState.Modified); 

Cela fonctionne bien et je crée l'audit au niveau des colonnes pour les tables sélectionnées. Chaque table/entité a un champ ID qui est un identifiant avec columnName = "ID". Donc, dans ma routine d'audit, j'accède simplement aux données de la colonne avec le nom "Id" pour obtenir l'ID de l'enregistrement audité.

Le problème que je le visage est au cours d'insertion. Le nouvel enregistrement n'a pas encore d'ID car c'est une colonne d'identité dans la base de données et est toujours 0.

Une solution que je peux penser est d'utiliser GUID pour toutes les Ids.Mais est-il un moyen de mettre en œuvre cela en utilisant l'identité standard int32 Ids?

grâce

Répondre

1

Lorsque nous insérons des données par EF la colonne d'identité n'est pas generted en insertion. Pour obtenir les colonnes Id of Identity, nous devons d'abord insérer les données puis seulement nous pouvons obtenir l'Id de coulmn.

veuillez s'il vous plaît jeter un coup d'œil ci-dessous ce qui pourrait vous être utile. http://www.codeproject.com/KB/database/ImplAudingTrailUsingEFP1.aspx

0

je ne sais pas maintenant combien d'entités que vous avez, mais dans notre propre implémentation de suivi de la vérification que nous avons créé une entité d'audit spécifique pour chaque entité pour que nous puissions les relier ensemble des propriétés de navigation creux et laisser l'ensemble de la base de données les clés d'identité.

Si vous utilisez l'héritage pour vos entités d'audit, il y a quit facile de les interroger.

Hope this helps :)

+0

Salut Wouter Merci d'avoir répondu.Je n'ai pas entièrement compris ce que vous avez suggéré.Mais vous créez probablement une clé F de la table d'audit à votre table réelle que vous avez 1 table d'audit pour chaque entité.Mais dans mon cas je n'ai qu'un Table d'audit unique pour toutes les entités – josephj1989

+0

Pourquoi est-ce que vous êtes limité à une table? Si vous utilisez l'héritage TablePerHierarchy, vous pouvez toujours mettre toute votre hiérarchie d'héritage dans la table. Vous auriez par exemple un type PersonAudit avec une propriété TargetPerson et un TargetPersonId (FK) et un OrderAudit avec une propriété TargetOrder et un TargetOrderId –

0

Les colonnes d'identité ne sont pas générées lors de l'insertion. Une fois les données insérées, vous pouvez uniquement obtenir des données de colonne d'identité dans EF. Ainsi, vous pouvez essayer de travailler en obtenant Id après l'insertion, puis en remplissant la table d'audit avec cet ID.