Frage

In Auftrag zu vollständig nutzen LinqToSql in einem ASP.net 3.5-Anwendung, ist es notwendig, zu erstellen DataContext Klassen (das ist normalerweise getan mit dem designer in VS 2008).Aus einer UI-Perspektive, der DataContext ist ein design, die Teile Ihrer Datenbank, die Sie möchten zu setzen Sie, um durch LinqToSql und ist ein integraler Bestandteil bei der Einrichtung des ORM-Funktionen von LinqToSql.

Meine Frage ist:Ich bin einrichten eines Projekts verwendet, die eine große Datenbank, in der alle Tabellen, die miteinander verbunden sind in irgendeiner Weise durch Foreign Keys.Meine erste Neigung ist es zu machen eine riesige DataContext-Klasse, die Modelle der gesamten Datenbank.So konnte ich in der Theorie (obwohl ich nicht weiß, ob dies in der Praxis ankommt) verwenden Sie die Foreign Key-verbindungen, entstehen durch LinqToSql zu leicht gehen zwischen die verbundenen Objekte in meinem code, legen Sie zusammengehörige Objekte, etc.

Jedoch, nach einigem nachdenken, ich bin jetzt denken, dass es möglicherweise mehr Sinn machen, erstellen Sie mehrere DataContext-Klassen, die jeweils in Bezug auf einen bestimmten namespace oder logisch miteinander verbundener Abschnitt in meiner Datenbank.Meine größte Sorge ist, dass die Instanziierung und der Entsorgung eine riesige DataContext-Klasse aller Zeiten für die einzelnen Vorgänge, die sich auf bestimmte Bereiche der Datenbank stellt eine unnötige Zumutung an application resources.Zusätzlich, es ist einfacher zu erstellen und zu verwalten kleinere DataContext-Dateien als eine große.Die Sache, die ich verlieren würde, ist, dass es würde werden einige entfernte Teile der Datenbank, die würde nicht schiffbar durch LinqToSql (obwohl eine Kette von Beziehungen verbindet Sie in die tatsächliche Datenbank).Zusätzlich, es würde eine Tabelle Klassen, die existieren würde, in mehr als einen DataContext.

Irgendwelche Gedanken oder Erfahrungen auf, ob mehrere DataContexts (entsprechend der DB-namespaces) sind entsprechende anstelle von (oder zusätzlich zu) einer sehr großen DataContext-Klasse (entsprechend der gesamten DB)?

War es hilfreich?

Lösung

Ich bin nicht einverstanden mit John ' s Antwort.Der DataContext (oder Linq to Entities ObjectContext) ist mehr eine "Einheit der Arbeit" als eine Verbindung.Es verwaltet change tracking, etc.Finden Sie in diesem blog-post für eine Beschreibung:

Lebensdauer eines LINQ to SQL DataContext

Die vier wichtigsten Punkte des blog-posts sind, die DataContext:

  1. Ideal geeignet ist für eine "unit of work" - Ansatz
  2. Eignet sich auch für die "stateless" server-Betrieb
  3. Eignet sich nicht für die Langlebige Nutzung
  4. Should be used very carefully after
    any SumbitChanges() operation.
    

Wenn man bedenkt, dass, ich glaube nicht, dass Sie mehr als einen DataContext würde also nicht Schaden, in der Tat, erstellen verschiedene DataContexts für verschiedene Arten von Arbeit würde helfen, machen Sie Ihre LinqToSql impelmentation mehr verwendbar und organisiert.Der einzige Nachteil ist, dass Sie nicht in der Lage sein zu verwenden sqlmetal, auto-generieren Sie Ihre dmbl.

Andere Tipps

Ich hatte das Gerangel über die gleiche Frage, während retro-fitting LINQ zu SQL über ein Vermächtnis von DB.Unsere Datenbank ist ein bisschen ein whopper (150 Tabellen) und nach einigem nachdenken und Experimentieren habe ich gewählt, um mehrere DataContexts.Ob dies als ein anti-pattern, bleibt abzuwarten, aber für jetzt, es macht das Leben überschaubar.

Ich denke, John ist richtig.

"Meine größte Sorge ist, dass die Instanziierung und der Entsorgung eine riesige DataContext-Klasse aller Zeiten für die einzelnen Vorgänge, die sich auf bestimmte Bereiche der Datenbank stellt eine unnötige Zumutung an application resources"

Wie unterstützen Sie diese Aussage?Was ist Ihr experiment, das zeigt, dass eine große DataContext ist ein performance-Engpass?Mehrere datacontexts ist wie eine Menge, die mit mehreren Datenbanken und sinnvoll in ähnlichen Szenarien, das heißt, kaum jemals.Wenn Sie sind mit mehreren datacontexts, die Sie brauchen, um zu verfolgen, welche Objekte gehören die datacontext-und Sie können nicht beziehen Objekte, die nicht in der gleichen Daten-Kontext.Das ist eine aufwendige Konstruktion Geruch für keinen wirklichen Vorteil.

@Evan "DataContext (oder Linq to Entities ObjectContext) ist mehr eine "Einheit der Arbeit" als eine Verbindung" Das ist genau, warum sollten Sie nicht mehr als einen datacontext.Warum würden Sie wollen mehr, dass eine "Einheit der Arbeit" in einer Zeit?

Ich bin nicht einverstanden mit der akzeptierten Antwort.In der Frage, das system hat eine einzige große Datenbank mit stark Fremdschlüssel-Beziehungen zwischen den fast jeder Tisch (auch der Fall, wo ich arbeite).In diesem Szenario bricht es in kleinere DataContexts (DC) hat zwei unmittelbare und gravierende Nachteile (beide erwähnt von der Frage):

  1. Verlieren Sie Beziehungen zwischen Tabellen. Sie können versuchen, wählen Sie Ihre DC-Grenzen mit bedacht, aber Sie werden schließlich laufen in eine situation, wo wäre es sehr bequem zu bedienen eine Beziehung zwischen einer Tabelle in einem DC zu einer Tabelle in die andere, und Sie werden nicht in der Lage.
  2. Einige Tabellen erscheinen in mehreren DC. Dies bedeutet, dass, wenn Sie hinzufügen möchten, Tisch-spezifische Helfer-Methoden, business-Logik oder anderen code in partiellen Klassen, die Arten nicht werden kompatibel mit mehreren DC.Sie können dies umgehen, indem Sie erbt jede entity-Klasse von seine eigenen, speziellen Basisklasse, die bekommt chaotisch.Auch, schema-änderungen müssen dupliziert werden über mehrere DC.

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

Meine größte Sorge ist, dass die Instanziierung und der Entsorgung eine riesige Der DataContext-Klasse aller Zeiten für die einzelnen Vorgänge, die sich zu den spezifischen Bereichen der Datenbank wäre die Einführung einer unnötigen Einführung über Anwendung Ressourcen.

Tatsächlich, es ist nicht wahr, dass ein großes DC-nimmt erheblich mehr Zeit zu instanziieren, oder verwenden Sie in einer typischen Einheit der Arbeit.In der Tat, nachdem die erste Instanz erstellt wird, die in einem Laufenden Prozess nachfolgenden Kopien der gleichen DC erstellt werden können, fast augenblicklich.

Der einzige wirkliche Vorteil von mehreren DC ist für eine einzige, große Datenbank mit gründlichen Fremdschlüssel-Beziehungen ist, dass Sie aufzuspalten Ihren code ein wenig besser.Sie können aber mache das schon mit partiellen Klassen.

Auch, die Einheit von Arbeit-Konzept ist nicht wirklich relevant für die ursprüngliche Frage.Einheit von arbeiten in der Regel bezieht sich darauf, wie viel eine Arbeit einer einzelnen DC Beispiel tut, nicht, wie viel Arbeit ein DC Klasse ist Lage zu tun.

Meine Erfahrung mit LINQ to SQL und LINQ to Entities einen DataContext ist ein Synonym für die Verbindung zur Datenbank.Also, wenn Sie auf mehreren Datenspeichern müssen Sie mehrere DataContexts.Mein Bauchgefühl ist Sie nicht bemerken würde, zu viel von einer Verlangsamung mit einem DataContext, die umfasst eine große Anzahl von Tabellen.Wenn Sie Tat, aber Sie konnte immer aufteilen der Datenbank logisch an Punkte, wo Sie isolieren Tabellen haben keine Beziehung zu anderen Gruppen von Tabellen und erstellen Sie mehrere Kontexte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top