2010-01-21 15 views
0

J'ai besoin de savoir si un objet avec une clé primaire particulière est déjà attaché à un DataContext et obtenir l'entité du DataContext s'il est attaché. Y a-t-il un moyen de faire cela qui n'exige pas de réflexion avec une confiance totale?Comment puis-je accéder ou remplacer LINQ à IdentityManager de SQL?

Idéalement, je voudrais appeler GetCachedObject(), mais je devrais utiliser la réflexion pour y arriver, et je suis sûr que je devrais être en mode confiance totale, ce qui ne fonctionnera pas dans un environnement hébergé.

Je suis ouvert à la réflexion en dehors de la boîte ici. En outre, je peux contrôler complètement le code LinqToSql généré, donc ce n'est pas un problème non plus. Je peux réécrire ma classe DataContext. Est-il possible d'accéder à IdentityManager, de remplacer IdentityManager par ma propre abstraction, etc.? Toutes les idées sont les bienvenues.

+0

Non, la réflexion est le seul moyen. – KristoferA

Répondre

0

Une solution de contournement potentielle. Je ne l'ai pas essayé, donc je ne sais pas si cela fonctionnera ... ... mais puisque vous avez dit 'out of the box': Affectez une mauvaise connexion ou une mauvaise chaîne de connexion au DC, ou dérangez la connexion sql il a déjà. Prochaine requête pour l'objet par PK. Si c'est dans le cache, il y a de fortes chances que L2S ne remarque pas que la connexion est mauvaise, donc vous devriez récupérer l'objet. Si ce n'est pas dans le cache, L2S devrait essayer un roundbuster db et vous obtiendrez une exception. Comme je l'ai dit, sale et non testé, mais vaut la peine d'essayer si vous voulez vraiment éviter d'utiliser la réflexion pour avoir accès au gestionnaire d'identité/changer de traqueur. Vous ne savez pas si cela vous sauvera des cycles CPU ... :)

+1

Merci pour la suggestion. J'ai décidé que c'était trop méchant pour accomplir ce que j'essayais de faire. Bien que la réflexion fonctionne, elle ne fonctionnera pas dans un environnement hébergé. Je vais me diriger dans une direction complètement différente. Je souhaite vraiment que MS libère LinqToSql en open source et laisse la communauté relâcher le deathgrip qu'est le DataContext. –

0

Si vous contrôlez le code généré, laissez le ctor de chaque entité s'enregistrer dans un dictionnaire par thread. De cette façon, vous avez toutes les entités existantes du thread en cours. Si vous avez un datacontext par thread, vous avez maintenant une liste de toutes les entités chargées (mais pas nécessairement attachées).