asp.net - Est-ce que plusieurs classes DataContext sont appropriées?

Translate

Afin d'utiliser pleinement LinqToSql dans une application ASP.net 3.5, il est nécessaire de créerDataContext Des classes(ce qui est généralement fait en utilisant le 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 auxquelles vous souhaitez exposer via LinqToSql et fait partie intégrante de la configuration des fonctionnalités ORM de LinqToSql.

Ma question est la suivante: je mets en place un projet qui utilise une grande base de données où toutes les tables sont interconnectées d'une manière ou d'une autre via des clés étrangères. Ma première inclination est de créer une énorme classe DataContext qui modélise l'ensemble de la base de données. De cette façon, je pourrais en théorie (bien que je ne sache pas si cela serait nécessaire en pratique) utiliser les connexions de clé étrangère qui sont générées via LinqToSql pour passer facilement entre les objets liés dans mon code, insérer des objets liés, etc.

Cependant, après y avoir réfléchi, je pense maintenant qu'il peut être plus judicieux de créer plusieurs classes DataContext, chacune relative à un espace de noms spécifique ou à une section logique interdépendante dans ma base de données. Ma principale préoccupation est que l'instanciation et l'élimination permanente d'une énorme classe DataContext pour des opérations individuelles liées à des zones spécifiques de la base de données imposeraient une imposition inutile aux ressources de l'application. De plus, il est plus facile de créer et de gérer des fichiers DataContext plus petits qu'un gros fichier. Ce que je perdrais, c'est qu'il y aurait des sections distantes de la base de données qui ne seraient pas navigables via LinqToSql (même si une chaîne de relations les relie dans la base de données réelle). En outre, certaines classes de table existeraient dans plusieurs DataContext.

Des réflexions ou une expérience sur la question de savoir si plusieurs DataContexts (correspondant à des espaces de noms de base de données) sont appropriés à la place (ou en plus) d'une très grande classe DataContext (correspondant à l'ensemble de la base de données)?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je ne suis pas d'accord avec la réponse de John. Le DataContext (ou Linq to Entities ObjectContext) est plus une "unité de travail" qu'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 points principaux de cet article de blog sont que DataContext:

  1. Convient parfaitement à une approche «unité de travail»
  2. Est également conçu pour un fonctionnement de 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.
    

Compte tenu de cela, je ne pense pas que l'utilisation de plus d'un DataContext ferait du mal - en fait, la création de différents DataContexts pour différents types de travail aiderait à rendre votre impelmentation LinqToSql plus utilisable et organisée. Le seul inconvénient est que vous ne pourriez pas utiliser sqlmetal pour générer automatiquement votre dmbl.

La source
Kev
Translate

Je m'étais disputé sur la même question tout en rétablissant LINQ to SQL sur une base de données héritée. Notre base de données est un peu énorme (150 tables) et après réflexion et expérimentation, j'ai choisi d'utiliser plusieurs DataContexts. Reste à voir si cela est considéré comme un anti-modèle, mais pour l'instant, cela rend la vie gérable.

La source
Translate

Je pense que John a raison.

"Ma principale préoccupation est que l'instanciation et l'élimination permanente d'une énorme classe DataContext pour des opérations individuelles liées à des zones spécifiques de la base de données imposerait une imposition inutile sur les ressources de l'application"

Comment soutenez-vous cette affirmation? Quelle est votre expérience qui montre qu'un grand DataContext est un goulot d'étranglement des performances? Avoir plusieurs contextes de données ressemble beaucoup à avoir plusieurs bases de données et a du sens dans des scénarios similaires, c'est-à-dire presque jamais. Si vous travaillez avec plusieurs contextes de données, vous devez suivre quels objets appartiennent à quel contexte de données et vous ne pouvez pas associer des objets qui ne sont pas dans le même contexte de données. C'est une odeur de conception coûteuse sans réel avantage.

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

La source
Translate

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

  1. Vous perdez les relations entre certaines tables.Vous pouvez essayer de choisir judicieusement vos limites de DC, mais vous finirez par vous retrouver dans une situation où il serait très pratique d'utiliser une relation d'une table dans un DC à une table dans un autre, et vous ne pourrez pas le faire.
  2. Certaines tables peuvent apparaître dans plusieurs DC.Cela signifie que si vous souhaitez ajouter des méthodes d'assistance spécifiques à la table, une logique métier ou un autre code dans des classes partielles, les types ne seront pas compatibles entre les contrôleurs de domaine. Vous pouvez contourner ce problème en héritant chaque classe d'entité de sa propre classe de base spécifique, ce qui devient compliqué. En outre, les modifications de schéma devront être dupliquées sur plusieurs contrôleurs de domaine.

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

Ma principale préoccupation est que l'instanciation et la suppression d'une énorme classe DataContext tout le temps pour des opérations individuelles liées à des zones spécifiques de la base de données imposeraient une imposition inutile aux ressources de l'application.

En fait, il n'est pas vrai qu'un grand contrôleur de domaine prenne beaucoup plus de temps à instancier ou à utiliser dans une unité de travail typique. En réalité,une fois la première instance créée dans un processus en cours d'exécution, les copies suivantes du même contrôleur de domaine peuvent être créées presque instantanément.

Le seul véritable avantage de plusieurs contrôleurs de domaine pour une seule et grande base de données avec des relations de clés étrangères approfondies est que vous pouvez compartimenter un peu mieux votre code. Mais vous pouvez déjà le faire avec des classes partielles.

De plus, le concept d'unité de travail n'est pas vraiment pertinent par rapport à la question initiale. L'unité de travail fait généralement référence à la quantité de travail d'un seul CDexemplefait, pas combien de travail un DCclasseestcapableDe faire.

La source
Translate

D'après 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, vous devrez utiliser plusieurs DataContexts. Ma réaction instinctive est que vous ne remarquerez pas beaucoup de ralentissement avec un DataContext qui englobe un grand nombre de tables. Si tel est le cas, vous pouvez toujours diviser la base de données de manière logique à des points où vous pouvez isoler des tables qui n'ont aucune relation avec d'autres ensembles de tables et créer plusieurs contextes.

La source