2011-06-03 3 views
0

Je voudrais implémenter IdbSet pour fournir à mon DbContext une implémentation personnalisée qui servira essentiellement à filtrer mes données pour l'utilisateur actuellement connecté (je travaille sur une application multi-locataire). L'idée générale avec laquelle je vais est très similaire à ce post: Can a DbContext enforce a filter policy?Entity Framework - implémenter IDbSet

Cependant, il n'est pas clair comment faire pour que DbContext "sache" comment utiliser ma propre classe qui implémente IDbSet. J'ai du mal à trouver de la documentation à ce sujet. N'importe quel pointeur serait utile!

TIA, -jle

Répondre

1

Je suis presque sûr que vous ne pouvez pas créer votre propre implémentation de IDbSet et le transmettre à cadre de l'entité. Une telle implémentation perdra tout ce qui concerne EF qui est implémenté en interne dans DbSet lui-même - en interne, je veux vraiment dire qu'il n'y a pas d'API publique pour le remplacer. IDbSet interface est fourni non pas parce qu'il est censé créer vos propres ensembles, mais parce qu'il permet des ensembles moqueurs lors de l'application de test unitaire. La seule façon que vous pouvez étendre la fonctionnalité est soit:

  • Héritant DbSet mais je crains que cela ne vous aidera pas aussi bien parce que les méthodes/propriétés ne seront pas marqués comme virtual.
  • Création de l'implémentation personnalisée IDbSet qui va envelopper DbSet. Cela ressemble à la meilleure chance, mais vous pouvez toujours trouver que DbContext n'aime pas votre nouvelle mise en œuvre. J'ai essayé très rapidement mais je n'ai pas réussi. Ma mise en œuvre a fonctionné pour persister mais pas pour interroger.
+0

Merci Ladislav. J'ai mal compris l'intention derrière/les capacités actuelles de DbContext et IDbSet. Je chercherai un autre moyen d'implémenter le multi-tenancy dans mon application. Merci encore pour votre aide! – jle

+1

Vous pouvez toujours envelopper votre accès aux données et ajouter la condition 'Where' dans l'encapsuleur. –