Instantiieren eines Kontexts in LINQ auf Entitäten

entity entity-framework linq linq-to-entities

Frage

Ich habe zwei verschiedene Arten gesehen, die Programmierer beim Erstellen eines Entitätskontexts in ihrem Code angehen.

Das erste ist wie das, und Sie finden es in den MSDN-Codebeispielen:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

Die zweite besteht darin, den Kontext als privates Attribut in einer Klasse zu erstellen, die Ihre Geschäftslogik enthält. Sie hätten also so etwas wie:

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

Welcher Weg ist effizienter?

Angenommen, Sie haben zwei Methoden, eine mit dem Namen DoSomething1 () und eine andere mit dem Namen DoSomething2 (). Beide Methoden enthalten die using-Anweisung, um den Kontext zu öffnen und mit dem zu tun, was auch immer. Müssen Sie eine Methode nach der anderen aufrufen? Gibt es einen überflüssigen Overhead, da im Wesentlichen beide Methoden den Kontext erstellen und ihn anschließend bereinigen, wenn sie fertig sind? Im Gegensatz zu nur einem privaten Attribut, das erstellt wird, wenn ein Klassenobjekt instanziiert wird, und dann bereinigt wird, wenn das Objekt den Gültigkeitsbereich verlässt?

Akzeptierte Antwort

Das Erstellen eines neuen ObjectContext-Objekts erfordert jedes Mal einen gewissen Aufwand. Im Wesentlichen ist der damit verbundene Overhead das Kopieren von Metadaten aus einem globalen Cache in Metadaten, die dem jeweiligen ObjectContext zugeordnet sind.

Dieser Aufwand ist relativ gering, so dass es sich oft lohnt, sich keine Sorgen zu machen, insbesondere wenn Sie die zusätzliche Sicherheit in Betracht ziehen, die das Nutzungsmuster mit sich bringt.

Welche Option Sie wählen, hängt für mich von folgenden Dingen ab:

  1. Wie langlebig wird Ihre Packung wahrscheinlich sein? Wenn der ObjectContext lange lebt, kann er viele Entitäten enthalten, die sich im Laufe der Zeit verlangsamen. Daher kann jedes Mal ein neuer ObjectContext eine gute Idee sein.
  2. Werden Aufrufe der Methoden in Ihrer Umhüllungsklasse synchronisiert? Die ObjectContext-Klasse selbst ist nicht threadsicher. Wenn Sie das zweite Muster verwenden, müssen Sie sicherstellen, dass die Wrapping-Klasse / das Repository threadsicher ist, wenn Sie erwarten, dass mehrere Threads sie aufrufen.
  3. Sind die Methoden im Wesentlichen nicht miteinander verbunden? In diesem Fall erhalten Sie möglicherweise unerwartete Nebenwirkungen, wenn sie einen Kontext zwischen den Methoden gemeinsam nutzen.

Im Allgemeinen empfehle ich, dass, wenn die Methoden zustandslos sind, dh Feuer ist und ein neuer Kontext für jede Methode vergessen wird, wahrscheinlich eine gute Idee ist.

Wenn Sie jedoch eine relativ kurzlebige zustandsorientierte Form oder etwas haben, ist ein gemeinsamer Kontext vielleicht eine bessere Idee.

UPDATE: Ich habe mir die Zeit genommen, eine vollständigere Antwort zusammenzustellen


Beliebte Antwort

Die zweite Option bereinigt tatsächlich nicht selbst, wenn Sie das meinen. Ich bevorzuge die Verwendung der ObjectContext-Version jedes Mal, weil ich sie nicht danach entsorgen muss. Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe ... Heute zu viele Stunden programmieren.

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

Um dieses Repository zu verwenden, mache ich so etwas wie:

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum