Sont des classes DataContext multiples jamais approprié?

voix
27

Pour utiliser pleinement LinqToSql dans une application ASP.net 3.5, il est nécessaire de créer DataContext des classes ( ce qui se fait habituellement à l' aide du concepteur dans VS 2008). Du point de vue de l' interface utilisateur, le DataContext est une conception des sections de votre base de données que vous souhaitez exposer à travers LinqToSql et fait partie intégrante de la mise en place des fonctions ORM de LinqToSql.

Ma question est: Je vais mettre en place un projet qui utilise une grande base de données où toutes les tables sont reliées entre elles d'une certaine façon par des clés étrangères. Ma première envie est de faire une grande classe DataContext qui modélise la base de données entière. De cette façon, je pouvais en théorie (bien que je ne sais pas si cela serait nécessaire dans la pratique) utiliser les connexions clés étrangères qui sont générés par LinqToSql pour aller facilement entre les objets liés dans mon code, insérer des objets connexes, etc.

Cependant, après lui avoir donné une certaine pensée, je pense maintenant qu'il peut être plus judicieux de créer plusieurs classes DataContext, chacun se rapportant à un espace de noms spécifique ou d'une section logique étroitement liés dans mon base de données. Ma principale préoccupation est que l'instanciation et de disposer d'une grande classe DataContext tout le temps pour les opérations individuelles qui se rapportent à des domaines spécifiques de la base de données serait imposer une imposition inutile sur les ressources d'application. De plus, il est plus facile de créer et gérer des fichiers plus petits DataContext d'un grand. La seule chose que je perdrais est qu'il y aurait des sections éloignées de la base de données qui ne serait pas navigable par LinqToSql (même si une chaîne de relations les relie dans la base de données réelle). De plus, il y aurait certaines classes de table qui existeraient dans plus d'un DataContext.

Toute pensée ou expérience sur plusieurs si DataContexts (correspondant à DB namespaces) sont appropriés à la place (ou en plus) une très grande classe DataContext (ce qui correspond à l'ensemble DB)?

Créé 05/08/2008 à 06:54
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
25

Je suis en désaccord avec la réponse de John. Le DataContext (ou aux entités Linq ObjectContext) est plus d'une « unité de travail » d'une connexion. Il gère le suivi des modifications, etc. Voir ce billet de blog pour une description:

Durée de vie d'un LINQ to SQL DataContext

Les quatre principaux points de ce billet de blog sont que DataContext:

  1. Est idéal pour une approche « unité de travail »
  2. Est également conçu pour le fonctionnement du serveur « sans état »
  3. N'est pas conçu pour une utilisation de longue durée
  4. Should be used very carefully after
    any SumbitChanges() operation.
    

Considérant que, je ne pense pas utiliser plus d'un DataContext ferait tout en fait des méfaits, la création de différents DataContexts pour différents types de travail contribuerait à rendre votre LinqToSql impelmentation plus usuable et organisé. Le seul inconvénient est que vous ne seriez pas en mesure d'utiliser SQLMetal pour générer automatiquement votre dmbl.

Créé 07/08/2008 à 22:02
source utilisateur

voix
4

J'avais été sur la même Wrangling question tout montage rétro LINQ to SQL sur une base de données existante. Notre base de données est un peu un gros mensonge (150 tables) et après réflexion et d'expérimentation, je choisi d'utiliser plusieurs DataContexts. Que cela soit considéré comme un anti-modèle reste à voir, mais pour l'instant il est facile à gérer la vie.

Créé 05/08/2008 à 23:51
source utilisateur

voix
3

Je suis en désaccord avec la réponse acceptée. Dans la question posée, le système a une seule grande base de données avec des relations solides clés étrangères entre presque toutes les tables (aussi le cas où je travaille). Dans ce scénario, le découper en petits DataContexts (DC de) présente deux inconvénients immédiats et majeurs (tous deux mentionnés par la question):

  1. Vous perdez des relations entre certaines tables. Vous pouvez essayer de choisir judicieusement vos limites DC, mais vous finirez par arriver à une situation où il serait très pratique d'utiliser une relation d'une table dans un courant continu à une table dans une autre, et vous ne serez pas en mesure de.
  2. Certaines tables peuvent apparaître dans plusieurs des CC. Cela signifie que si vous voulez ajouter des méthodes d'aide spécifiques à la table, la logique métier, ou tout autre code dans les classes partielles, les types ne seront pas compatibles entre DC de. Vous pouvez contourner ce problème en héritant chaque classe d'entité à partir de sa propre classe de base spécifique, qui devient malpropre. En outre, les changements de schéma devront être dupliqué sur plusieurs DC de.

Maintenant, ce sont des inconvénients importants. Y at-il des avantages assez grand pour les surmonter? La question mentionne la performance:

Ma principale préoccupation est que l'instanciation et de disposer d'une grande classe DataContext tout le temps pour les opérations individuelles qui se rapportent à des domaines spécifiques de la base de données serait imposer une imposition inutile sur les ressources d'application.

, Il est en fait pas vrai qu'un grand DC prend beaucoup plus de temps à instancier ou utiliser dans une unité de travail typique. En fait, après la première instance est créée dans un processus en cours d'exécution, les copies ultérieures du même courant continu peuvent être créés presque instantanément .

Le seul avantage réel de nombreux DC est pour une base de données unique, grande avec des relations clés étrangères approfondies est que vous pouvez compartimenter votre code un peu mieux. Mais vous pouvez déjà le faire avec des classes partielles.

En outre, l'unité de concept de travail n'est pas vraiment pertinent à la question initiale. Unité de travail se réfère généralement à combien un travail un seul DC exemple fait, pas la quantité de travail d' une DC classe est capable de faire.

Créé 17/06/2014 à 21:53
source utilisateur

voix
3

Je pense que John est correct.

« Ma principale préoccupation est que l'instanciation et de disposer d'une grande classe DataContext tout le temps pour les opérations individuelles qui se rapportent à des domaines spécifiques de la base de données serait imposer une imposition inutile sur les ressources d'application »

Comment soutenez-vous cette déclaration? Quelle est votre expérience qui montre qu'un grand DataContext est un goulot d'étranglement? Avoir plusieurs DataContexts est un peu comme avoir plusieurs bases de données et logique dans des scénarios similaires, à savoir, presque jamais. Si vous travaillez avec plusieurs DataContexts vous devez garder une trace des objets qui appartiennent à datacontext et vous ne pouvez pas rapporter des objets qui ne sont pas dans le même contexte de données. C'est une odeur de conception coûteuse pour aucun avantage réel.

@ Evan « Le DataContext (ou LINQ to Entities ObjectContext) est plus d'une « unité de travail » qu'une connexion » qui est précisément la raison pour laquelle vous ne devriez pas avoir plus d'un DataContext. Pourquoi voudriez-vous plus d'une « unité de travail » à la fois?

Créé 27/08/2008 à 02:11
source utilisateur

voix
1

Dans mon expérience avec LINQ to SQL et LINQ to Entities un DataContext est synonyme d'une connexion à la base de données. Donc, si vous deviez utiliser plusieurs magasins de données que vous devez utiliser plusieurs DataContexts. Ma réaction instinctive est que vous ne remarquerez pas à une grande partie d'un ralentissement avec une DataContext qui englobe un grand nombre de tables. Si vous avez fait mais vous pouvez toujours diviser la base de données logiquement aux points où vous pouvez isoler les tables qui n'ont pas de lien avec d'autres ensembles de tables et de créer de multiples contextes.

Créé 05/08/2008 à 10:57
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more