Reuseable ObjectContext oder neue ObjectContext für jeden Satz von Operationen?
Ich bin neu in der Entitäten-Framework und bin gerade erst anfangen zu spielen, um mit ihm in meiner Freizeit. Eine der wichtigsten Fragen, die ich habe ist über, wie zu behandeln ObjectContexts.
Ist in der Regel bevorzugt/empfohlen dieser:
Diese
public class DataAccess{
MyDbContext m_Context;
public DataAccess(){
m_Context = new MyDbContext();
}
public IEnumerable<SomeItem> GetSomeItems(){
return m_Context.SomeItems;
}
public void DeleteSomeItem(SomeItem item){
m_Context.DeleteObject(item);
m_Context.SaveChanges();
}
}
, Oder?
public class DataAccess{
public DataAccess(){ }
public IEnumerable<SomeItem> GetSomeItems(){
MyDbContext context = new DbContext();
return context.SomeItems;
}
public void DeleteSomeItem(SomeItem item){
MyDbContext context = new DbContext();
context.DeleteObject(item);
context.SaveChanges();
}
}
- Etwas im Zusammenhang zu den stackoverflow.com/questions/1072391/...
- Und diese... stackoverflow.com/questions/226127 Obwohl die Diskussion ist Linq2Sql, gilt das gleiche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ObjectContext-gemeint ist die "Unit of Work".
Im wesentlichen, was dies bedeutet, ist, dass für jeden "Betrieb" (z.B.: jede web-Seite Anfrage) es sollte eine neue ObjectContext-Instanz. Innerhalb dieser operation, die gleichen ObjectContext sollten wieder verwendet werden.
Dies macht Sinn, wenn man darüber nachdenkt, wie Transaktionen und ändern Sie die Einreichung sind alle gebunden an die ObjectContext-Instanz.
Wenn Sie nicht schriftlich eine web-app, sondern schreiben Sie eine WPF-oder windows forms-Anwendung, es wird ein bisschen komplexer, als Sie nicht über die tight "Anfrage" - Bereich, der eine web-Seite-laden gibt Sie, aber Sie bekommen die Idee.
PS: In deinen Beispielen, die Lebensdauer des ObjectContext-entweder global, oder transient. In beiden Fällen sollte es NICHT zu Leben in der DataAccess-Klasse - es sollte übergeben werden, in einer Abhängigkeit, die
Wenn Sie immer den gleichen Rahmen für eine lang andauernde Prozess läuft viele Abfragen gegen Sie, linq-to-sql (habe ich nicht getestet gegen linq to entities, aber ich denke, dass ist das gleiche problem) wird SEHR langsam (1 Abfrage ein zweites nach einigen 1000 einfache Abfragen). Erneuerung der Zusammenhang auf einer regulären basis behebt dieses Problem, und kostet nicht so viel.
Was passiert, ist, dass der Kontext protokolliert jede Abfrage, die Sie tun, also, wenn es nicht zurückgesetzt werden, in einer Weise, wird es richtig Fett... Andere Frage, ist dann der Speicher es braucht.
So ist es vor allem abhängig von der Art und Weise Ihrer Anwendung arbeiten, und wenn Sie neue eine DataAccess-Instanz regelmäßig oder wenn Sie es genauso halten alle zusammen.
Hoffe, das hilft.
Stéphane
Nur eine kurze Notiz - die beiden code-Stücke sind ungefähr gleich in Ihren zugrunde liegenden problem. Dies ist etwas, was ich schaue, weil Sie nicht wollen, zu halten öffnen und schließen der Kontext (siehe zweites Beispiel) in der gleichen Zeit, die Sie nicht sicher sind, ob Sie Vertrauen können Microsoft richtig zu entsorgen, ist der Kontext für Sie.
Eines der Dinge, die ich Tat, war die Schaffung einer gemeinsamen Basis-Klasse, die faul Lasten der Kontext und die Umsetzung der base-Klasse zu zerstören-er entsorgen der Dinge. Dies funktioniert gut für so etwas wie das MVC-framework, aber leider führt zu dem problem, dass Sie übergeben werden, die den Zusammenhang der verschiedenen Ebenen, so die business-Objekte freigeben können den Anruf.
Am Ende ging ich mit etwas mit Ninject zu injizieren, diese Abhängigkeit in jeder Schicht und hatte es die Nutzung zu verfolgen
Während ich bin nicht für immer schaffen, was sein muss, komplizierte Objekte jedes mal, wenn ich Sie brauche - auch ich habe festgestellt, dass die DataContexts in Linq to Sql und ObjectContexts in EF sind am besten angelegt, wenn erforderlich.
Beide führen viel statische Initialisierung basierend auf dem Modell, das Sie führen Ihnen vor, was zwischengespeichert wird, für nachfolgende Aufrufe, so werden Sie feststellen, dass der erste Start für einen Kontext gibt, der mehr als alle nachfolgenden Instanzen.
Die größte Hürde, die Sie Gesicht mit diesem ist die Tatsache, dass, sobald Sie erhalten eine Entität aus dem Kontext, Sie können nicht einfach übergeben, die es wieder in eine zum ausführen von update-Operationen, hinzufügen oder Verwandte Unternehmen zurück. In der EF können Sie anfügen eine Person zurück, um einen neuen Kontext. In L2S dieser Prozess ist fast unmöglich.