2 Stimmen

Linq to SQL - Wie sollte ich Datenbankanfragen verwalten?

Ich habe mich ein wenig mit der Lebensdauer des DataContext befasst und versucht herauszufinden, was der bestmögliche Weg ist, die Dinge zu tun.

Da ich meine DAL in einer Webanwendung wiederverwenden möchte, entschied ich mich für die Datenkontext pro Business-Objekt-Anfrage Ansatz.

Meine Idee war es, meine L2S-Entitäten aus der dbml-Datei zu erweitern, um Informationen aus der Datenbank abzurufen, indem ich einen separaten Kontext pro Anfrage erstellt habe, z.B.

public partial class AnEntity
{
    public IEnumerable<RelatedEntity> GetRelatedEntities()
    {
        using (var dc = new MyDataContext())
        {
            return dc.RelatedEntities.Where(r => r.EntityID == this.ID);
        }
    }
}

In Bezug auf die Rückgabe der Entitäten ... muss ich POCOs an dieser Stelle zurückgeben oder ist es in Ordnung, einfach das Geschäftsobjekt aus der Abfrage zurückgegeben? Mir ist klar, dass der Versuch, auf Eigenschaften der zurückgegebenen Entität zuzugreifen (nachdem der DataContext entsorgt wurde), fehlschlagen würde. Dies ist jedoch der Grund, warum ich beschlossen habe, diese Art von Methoden zu implementieren, z. B.

Anstelle von:

AnEntity entity = null;
using (var repo = new EntityRepo())
{
    entity = repo.GetEntity(12345);   
}
var related = entity.RelatedEntities; // this would cause an exception

Theoretisch sollte ich dazu in der Lage sein:

AnEntity entity = null;
using (var repo = new EntityRepo())
{
    entity = repo.GetEntity(12345);   
}
var related = entity.GetRelatedEntities();

In Anbetracht der Umstände meiner speziellen Anwendung (muss in einem Windows-Dienst & Web-Anwendung arbeiten) würde ich gerne wissen, ob dies ein plausibler Ansatz zu sein scheint, ob es offensichtliche Mängel gibt und ob es bessere Ansätze für das, was ich zu tun versuche, gibt.

Gracias.

1voto

Robert Harvey Punkte 173098

Solange Sie ein einzelnes DataContext-Objekt nicht über mehr als einen Thread aufrufen, sollte im Allgemeinen alles in Ordnung sein. Mit anderen Worten: Verwenden Sie ein DataContext-Objekt pro Thread, und teilen Sie keine Daten oder Zustände zwischen verschiedenen DataContext-Objekten.

Die verbleibenden Multithreading-Probleme haben zu tun mit Gleichzeitigkeit in der Datenbank, nicht aber Threading-Operationen.

Abgesehen von diesen Vorbehalten scheint Ihr Ansatz solide zu sein. Sie können entweder partielle Klassen verwenden, um Ihre Geschäftsmethoden zu implementieren, oder Sie können eine Geschäftsschicht zwischen den Linq to SQL-Klassen und Ihrem Repository hinzufügen.

1voto

Sander Rijken Punkte 21069

Sie können damit durchkommen:

var repo = new EntityRepo();

entity = repo.GetEntity(12345);   

var related = entity.RelatedEntities;

Siehe dieser StackOverflow-Beitrag für eine Erklärung, warum die Nichtentsorgung Ihres Kontexts keine Verbindungslecks oder ähnliches verursacht.

Das Repository und der Kontext werden vom Garbage Collector aufgeräumt, wenn die Entitäten, die von ihnen geholt wurden, aus dem Anwendungsbereich fallen (beim Aufbau einer Website, am Ende der Anfrage).

Editar : MSDN Dokumente dass Verbindungen so spät wie möglich geöffnet und so schnell wie möglich geschlossen werden. Das Überspringen der Verwendung führt also nicht zu Problemen mit dem Verbindungspool.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X