asp.net - Sind mehrere DataContext-Klassen jemals geeignet?

Translate

Um LinqToSql in einer ASP.net 3.5-Anwendung vollständig nutzen zu können, muss es erstellt werdenDatenkontext Klassen(Dies erfolgt normalerweise mit dem Designer in VS 2008). Aus Sicht der Benutzeroberfläche ist der DataContext ein Entwurf der Abschnitte Ihrer Datenbank, denen Sie über LinqToSql zugänglich machen möchten, und ist ein wesentlicher Bestandteil beim Einrichten der ORM-Funktionen von LinqToSql.

Meine Frage ist: Ich richte ein Projekt ein, das eine große Datenbank verwendet, in der alle Tabellen auf irgendeine Weise über Fremdschlüssel miteinander verbunden sind. Meine erste Neigung besteht darin, eine riesige DataContext-Klasse zu erstellen, die die gesamte Datenbank modelliert. Auf diese Weise könnte ich theoretisch (obwohl ich nicht weiß, ob dies in der Praxis erforderlich wäre) die über LinqToSql generierten Fremdschlüsselverbindungen verwenden, um einfach zwischen verwandten Objekten in meinem Code zu wechseln, verwandte Objekte einzufügen usw.

Nachdem ich darüber nachgedacht habe, denke ich jetzt, dass es möglicherweise sinnvoller ist, mehrere DataContext-Klassen zu erstellen, die sich jeweils auf einen bestimmten Namespace oder einen logisch zusammenhängenden Abschnitt in meiner Datenbank beziehen. Mein Hauptanliegen ist, dass das sofortige Instanziieren und Entsorgen einer großen DataContext-Klasse für einzelne Vorgänge, die sich auf bestimmte Bereiche der Datenbank beziehen, die Anwendungsressourcen unnötig belasten würde. Darüber hinaus ist es einfacher, kleinere DataContext-Dateien als eine große zu erstellen und zu verwalten. Die Sache, die ich verlieren würde, ist, dass es einige entfernte Abschnitte der Datenbank geben würde, die nicht durch LinqToSql navigierbar wären (obwohl eine Kette von Beziehungen sie in der tatsächlichen Datenbank verbindet). Darüber hinaus würde es einige Tabellenklassen geben, die in mehr als einem DataContext vorhanden wären.

Irgendwelche Gedanken oder Erfahrungen darüber, ob mehrere DataContexts (entsprechend DB-Namespaces) anstelle (oder zusätzlich zu) einer sehr großen DataContext-Klasse (entsprechend der gesamten DB) geeignet sind?

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

Alle Antworten

Translate

Ich bin mit Johns Antwort nicht einverstanden. Der DataContext (oder Linq to Entities ObjectContext) ist eher eine "Arbeitseinheit" als eine Verbindung. Es verwaltet die Änderungsverfolgung usw. Eine Beschreibung finden Sie in diesem Blog-Beitrag:

Lebensdauer eines LINQ to SQL DataContext

Die vier Hauptpunkte dieses Blogposts sind der DataContext:

  1. Ist ideal für einen "Unit of Work" -Ansatz geeignet
  2. Ist auch für den "zustandslosen" Serverbetrieb ausgelegt
  3. Ist nicht für den langlebigen Gebrauch ausgelegt
  4. Should be used very carefully after
    any SumbitChanges() operation.
    

In Anbetracht dessen würde die Verwendung von mehr als einem DataContext meiner Meinung nach keinen Schaden anrichten. Das Erstellen verschiedener DataContexts für verschiedene Arten von Arbeiten würde dazu beitragen, dass Ihre LinqToSql-Impelmentation benutzerfreundlicher und organisierter wird. Der einzige Nachteil ist, dass Sie sqlmetal nicht verwenden können, um Ihr dmbl automatisch zu generieren.

Quelle
Kev
Translate

Ich hatte mich über dieselbe Frage gestritten, während ich LINQ über eine Legacy-Datenbank nachträglich an SQL angepasst hatte. Unsere Datenbank ist ein bisschen wie ein Whopper (150 Tabellen) und nach einigem Nachdenken und Experimentieren habe ich mich für die Verwendung mehrerer DataContexts entschieden. Ob dies als Anti-Muster angesehen wird, bleibt abzuwarten, aber es macht das Leben vorerst überschaubar.

Quelle
Translate

Ich denke John ist richtig.

"Mein Hauptanliegen ist, dass das sofortige Instanziieren und Entsorgen einer großen DataContext-Klasse für einzelne Vorgänge, die sich auf bestimmte Bereiche der Datenbank beziehen, die Anwendungsressourcen unnötig belasten würde."

Wie unterstützen Sie diese Aussage? Was ist Ihr Experiment, das zeigt, dass ein großer DataContext ein Leistungsengpass ist? Das Vorhandensein mehrerer Datenkontexte ähnelt dem Vorhandensein mehrerer Datenbanken und ist in ähnlichen Szenarien, dh kaum jemals, sinnvoll. Wenn Sie mit mehreren Datenkontexten arbeiten, müssen Sie verfolgen, welche Objekte zu welchem Datenkontext gehören, und Sie können keine Objekte verknüpfen, die sich nicht im selben Datenkontext befinden. Das ist ein kostspieliger Designgeruch ohne wirklichen Nutzen.

@Evan "Der DataContext (oder Linq to Entities ObjectContext) ist eher eine" Arbeitseinheit "als eine Verbindung." Genau deshalb sollten Sie nicht mehr als einen Datenkontext haben. Warum sollten Sie mehr als eine "Arbeitseinheit" gleichzeitig wollen?

Quelle
Translate

Ich muss der akzeptierten Antwort nicht zustimmen. In der gestellten Frage verfügt das System über eine einzige große Datenbank mit starken Fremdschlüsselbeziehungen zwischen fast jeder Tabelle (auch in dem Fall, in dem ich arbeite). In diesem Szenario hat die Aufteilung in kleinere DataContexts (DCs) zwei unmittelbare und große Nachteile (beide in der Frage erwähnt):

  1. Sie verlieren Beziehungen zwischen einigen Tabellen.Sie können versuchen, Ihre DC-Grenzen mit Bedacht auszuwählen, aber Sie werden irgendwann in eine Situation geraten, in der es sehr praktisch wäre, eine Beziehung von einer Tabelle in einem DC zu einer Tabelle in einem anderen zu verwenden, und Sie werden dies nicht können.
  2. Einige Tabellen können in mehreren Domänencontrollern angezeigt werden.Dies bedeutet, dass die Typen nicht über DCs hinweg kompatibel sind, wenn Sie tabellenspezifische Hilfsmethoden, Geschäftslogik oder anderen Code in Teilklassen hinzufügen möchten. Sie können dies umgehen, indem Sie jede Entitätsklasse von ihrer eigenen Basisklasse erben, was unübersichtlich wird. Außerdem müssen Schemaänderungen über mehrere Domänencontroller hinweg dupliziert werden.

Das sind erhebliche Nachteile. Gibt es Vorteile, die groß genug sind, um sie zu überwinden? Die Frage erwähnt die Leistung:

Mein Hauptanliegen ist, dass das sofortige Instanziieren und Entsorgen einer großen DataContext-Klasse für einzelne Vorgänge, die sich auf bestimmte Bereiche der Datenbank beziehen, die Anwendungsressourcen unnötig belasten würde.

Tatsächlich ist es nicht wahr, dass ein großer Gleichstrom erheblich mehr Zeit benötigt, um eine typische Arbeitseinheit zu instanziieren oder zu verwenden. Eigentlich,Nachdem die erste Instanz in einem laufenden Prozess erstellt wurde, können nachfolgende Kopien desselben DC fast sofort erstellt werden.

Der einzige wirkliche Vorteil mehrerer Domänencontroller für eine einzige große Datenbank mit gründlichen Fremdschlüsselbeziehungen besteht darin, dass Sie Ihren Code etwas besser unterteilen können. Dies können Sie jedoch bereits mit Teilklassen tun.

Auch das Konzept der Arbeitseinheit ist für die ursprüngliche Frage nicht wirklich relevant. Die Arbeitseinheit bezieht sich normalerweise darauf, wie viel Arbeit ein einzelner DC leistetBeispielmacht, nicht wie viel Arbeit ein DCKlasseistfähigzu tun.

Quelle
Translate

Nach meiner Erfahrung mit LINQ to SQL und LINQ to Entities ist ein DataContext gleichbedeutend mit einer Verbindung zur Datenbank. Wenn Sie also mehrere Datenspeicher verwenden würden, müssten Sie mehrere DataContexts verwenden. Meine Bauchreaktion ist, dass Sie mit einem DataContext, der eine große Anzahl von Tabellen umfasst, keine große Verlangsamung bemerken würden. Wenn Sie dies jedoch getan haben, können Sie die Datenbank immer logisch an Punkten aufteilen, an denen Sie Tabellen isolieren können, die keine Beziehung zu anderen Tabellensätzen haben, und mehrere Kontexte erstellen können.

Quelle