2013-04-17 5 views
7

를 사용하여 엔티티 프레임 워크 컨텍스트를 선언하는 엔티티 프레임 워크 컨텍스트선언의 모범 사례가 어느

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

    //Entity code 

    return ; 
} 

또는

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

우리가 EntityFrameWork에 사용 사용해야합니까? DATAACCESS 레이어에서

는 EF을 실행하고 내 DL

사용하여 내부를 IEnumerable에 결과를 저장하고 내 두번째 질문 그렇다면 컨트롤러

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

에서 그리고 내 컨트롤러 오전에

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

이 작업을 목록으로 가져 오는 중 일부 작업을 수행해야합니다. 작업을 찾는 중입니다.

내가 IEnumerable을 함께 사용하여 사용하는 경우

예 내가 DL에서 목록을 반환 할 수 있으며 잘 작동

어떻게이 문제를 해결할 수 있습니까?

+1

.ToList(); 내가이 SO 링크가 정확히 무엇을 생각 사용하여 결과를 .Include(emp => emp.Manager) (LINQ 확장 방법)을 사용하고 결합함으로써 이러한 문제를 방지 할 수 있습니다

일반적인 부정적인 결과는이 시나리오에서 발생 당신이 물었다 : http://stackoverflow.com/questions/824330/should-entity-framework-context-be-put-into-using-statement?rq = 1 –

+0

예 제 2의 질문을 확인하십시오 – user2067567

+0

[Statement and Entity Framework 사용하기] (http://stackoverflow.com/questions/13826536/using-statement-and-entity-framework) – Habib

답변

7

당신은 문맥이 배치되기 전에 IEnumerable.ToList()를 호출하여 게으른 로딩 EF 동작을 방지 할 수 있습니다 (귀하의 using 블록 내에서 예)

+0

감사합니다 @paul . 어떻게 제 2의 질문. 그게 잘못된 길입니까? – user2067567

+0

그래, 아직도 바울이 말한 것처럼 사용하십시오. +1 주어진. 모델에 손주가있는 경우에도 비슷한 문제가 발생합니다. 나는 그 하나를 아직 풀어 내지 못했다. – James

+1

@James 원래의 Linq 문에서'.Include()'를 사용하여 자녀/손자녀를 얻을 수 있다고 생각합니다. – paul

3
요청이 즉시 데이터 원본으로 실행됩니다

당신은 전화 할게로 .ToList() 메소드.

그렇기 때문에 사용중인 블록의 끝에 배치 된 컨텍스트로 컨트롤러에서 .ToList()를 수행 할 수 없습니다. 당신이 뭔가를 IEnumerable를 얻을 수 있습니다

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

하고 컨트롤러에서 : 당신의 DL 방법에

, 뭔가 같이 할 수 있습니다

var mySomethingIEnumerable = DL.Function(); 

희망을!

6

예, 컨텍스트를 정리하기 때문에 사용하는 것이 가장 좋습니다. 명심

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

, 당신의 문맥 가능성이 IEnumerables를 반환하고 EF 게으른 로딩을 지원하기 때문에 당신이 구체적인 컬렉션에 가져올 때까지 이러한 개체가 채워지지 않습니다 (즉, yourResult.ToList 다음 Using statement는 바로 가기의입니다.()).

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; 

당신은

관련 문제