2010-10-22 3 views
1

Je voudrais savoir quand les entités d'une certaine table de base de données sont créées ou mises à jour. L'application est essentiellement un CMS, et j'ai besoin de savoir quand des modifications sont apportées au contenu afin que je puisse les réindexer pour les recherches. Je sais que la classe LINQ à EF autogénérée a des méthodes substituables pour quand certains champs changent, mais j'ai besoin de savoir quand l'objet entier est créé/mis à jour, pas seulement un seul champ. J'ai essayé de le mettre dans OnCreated, seulement pour trouver que cela signifiait OnObjectInitialized et non OnObjectInsertedIntoDBTable xDCallbacks sur l'entité créée/mise à jour

J'ai fait quelques recherches et j'ai rencontré this link. La section «État de l'entité» ressemble à ce que je veux, mais je ne suis pas sûr de savoir comment utiliser cette information. Où dois-je remplacer ces méthodes?

Ou peut-être existe-t-il un autre/meilleur moyen?

(Je dois également le savoir pour une autre partie du système, qui enverra des notifications lorsque certains contenus sont modifiés.Je préférerais que ce code s'exécute automatiquement lorsque l'insertion/mise à jour se produit au lieu de le placer dans un contrôleur. En espérant que j'appelle toujours cette méthode.)

Répondre

2

Vous devez obtenir ObjectStateEntry (s) à partir de la propriété ObjectStateManager du ObjectContect.

var objectStateEntries = this.ObjectStateManager.GetObjectStateEntries(); 

Ces entrées contiennent tous les états d'objets que vous avez extraits par contexte et le type d'actions effectuées sur ces objets.

Si vous utilisez EF4, vous pouvez remplacer la méthode SaveChanges pour inclure cette fonctionnalité. J'ai utilisé cette technique pour vérifier chaque changement qui se produit dans la base de données au lieu de déclencheurs.

+0

Je suis toujours perdu: -/Je ne comprends pas complètement EF pour être honnête, et j'utilise ASP.NET MVC 2 (.NET 4) donc je crois que tout cela est généré pour moi via le Concepteur .dbml (crée une classe qui hérite de System.Data.Linq.DataContext). Suis-je confondre EF avec quelque chose d'autre ou peut-être juste en regardant dans les mauvais endroits? –

+0

@Colin O'Dell - Il existe 4 stratégies de génération différentes, donc ce n'est jamais garanti que le code généré aura ces hooks. Fondamentalement chaque ORM a un concept de suivi d'état en son sein. Un objet est abattu et une référence (sorta) est conservée. ObjectContext d'EF fournit ce suivi d'état. C'est ce que vous devez suivre lorsque les entités sont créées et mises à jour. – jfar

+0

OK merci. Je sais que je peux extraire une entité du contexte de données, la modifier et appeler Save() sur le contexte de données, qui sait exactement ce qui a été modifié. Je vais creuser un peu plus profond et voir ce que je peux trouver. Merci encore pour votre aide! –