2013-04-17 23 views
7

Welches ist die Best Practice in Deklarieren von Entity Framework ContextsDeklarieren von Entity Framework Contexts mit der Verwendung von

function() 
{ 
    DBContext context = new DBContext(); 

    //Entity code 

    return ; 
} 

oder

function() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     //Entity code 
    } 
} 

Müssen wir verwenden Verwendung in EntityFramework ist? Wenn ja meine zweite Frage

In Data Access Layer-bin Ausführung EF und das Ergebnis in IEnumerable Speicherung innen mit

MY DL

function() 
{ 
    IEnumerable something = null; 
    using(DBContext context = new DBContext()) 
    { 
     IEnumerable something = .... 
    } 
    return something; 
} 

Kontroller

function() 
{ 
    List some = something.ToList(); 
} 

Und in meinem Controller Uhr Erhalten dieses als eine Liste, wie ich etwas Suchen müssen, ist das Erhalten

"The operation cannot be completed because the DbContext has been disposed Entity Framework" 

Ja ich eine Liste von DL zurückkehren kann und es funktioniert gut

Wie gehe ich das, wenn ich mit IEnumerable verwenden verwenden?

+1

ich denke, das SO Link ist genau das, was Sie haben gefragt: http://stackoverflow.com/questions/824330/should-entity-framework-context-be-put-into-using-statement?rq = 1 –

+0

ja, falls Sie bitte meine 2. Frage – user2067567

+0

möglich Duplikat [Mit Statement und Entity Framework] (http://stackoverflow.com/questions/13826536/using-statement-and-entity-framework) – Habib

Antwort

7

Sie können die lazy-Laden EF-Verhalten vermeiden, indem .ToList() auf dem IEnumerable Aufruf vor der Kontext (dh in Ihrem using Block) angeordnet ist

+0

Dank überprüfen @ Paul . wie ab meine 2. Frage. Ist das ein falscher Weg? – user2067567

+0

Yep, verwenden immer noch mit, wie sagte Paul. +1 gegeben. Sie erhalten jedoch immer noch ein ähnliches Problem, wenn Ihr Modell über Enkelobjekte verfügt. Ich habe noch keine Zeit damit verbracht, diesen zu lösen. – James

+1

@James Ich glaube, Sie können Ihre Kinder/Enkelkinder erhalten, indem mit '.INCLUDE()' in der ursprünglichen Linq-Anweisung – paul

3

Ihre Anfrage wird so schnell in Richtung der Datenquelle ausgeführt werden, wie Sie rufen .ToList() -Methode.

Aus diesem Grund können Sie .ToList() nicht in Ihrem Controller ausführen, da Ihr Kontext am Ende des Verwendungsblocks liegt.

In Ihrer DL Methode, tut nur so etwas wie:

IEnumerable<Something> function() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     return something.ToList(); 
    } 
} 

und in dem Controller erhalten Sie eine IEnumerable von etwas bekommen:

var mySomethingIEnumerable = DL.Function(); 

Hoffnung, das hilft!

6

Ja, eine Verwendung ist die beste Vorgehensweise, weil es Ihren Kontext aufräumt. Die Using statement ist eine Abkürzung für:

try { 
    // Execute your code inside the using statement 
} 
finally { 
    // Cleanup the context no matter what by calling .Dispose() 
} 

Denken Sie daran, Ihren Kontext IEnumerables wahrscheinlich zurückgibt und da EF verzögertes Laden unterstützt werden diese Objekte nicht aufgefüllt werden, bis Sie sie auf eine konkrete Sammlung holen (dh yourResult.ToList.()).

Ein gemeinsames negatives Ergebnis tritt in diesem Szenario:

public IEnumerable<Employee> GetEmployeesInAccounting() 
{ 
    using(var myContext = new MyDbContext()) 
    { 
     return myContext.Employees.Where(emp => emp.Department == 'Accounting'); 
    } 
} 

// Code that fails, Assuming Manager is a lazy loaded entity, this results in an exception but it compiles no problem 
var acctEmps = GetEmployeesInAccounting(); 
var something = acctEmps.First().Department.Manager.Department; 

Sie können dies vermeiden, indem Sie die .Include(emp => emp.Manager) (Linq Extension-Methode) und Binden Sie Ihr Ergebnis mit .ToList();

Verwandte Themen