0

"DBContext"라는 전역 변수를 컨트롤러에 선언하고 모든 데이터베이스 작업에 사용하는 것이 맞습니까?DbContext 선언 - Framework 4.1 - MVC 3.0

예 : 내가 시도

+2

가능한 복제본 [LINQ to Entities에서 인스턴스 생성] (http : // stackoverflow. com/questions/813457/entity-linq-to-entities에 대한 인스턴스 생성). DbContext의 수명주기 관리는 이미 논의되었습니다. (http://stackoverflow.com/questions/6334592/one-dbcontext-per-request-in-asp-net-mvc-without-ioc-container) ] (http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in-mvc). –

답변

1

public class ProductController : Controller 
{ 
    private readonly DBContextEntities _db = new DBContextEntities(); 

    public ActionResult Index() 
    { 
    var products = _db.Products.ToList(); 
    return View(products); 
    } 

    public ActionResult Create() 
    { 
    _db.Products.AddObject(new Product{Name="x",Price="5.2"}); 
    _db.SaveChanges(); 
    return View(products); 
    } 

}

하십시오 조언, 몇 번이 최대 무게입니다. 대부분의 상황에서는 괜찮을 것이라고 결론을 내 렸습니다. 이것은 '왜'나는 그것이 괜찮을 것이라고 생각합니다.

모든 조언은 최대한 짧은 시간 동안 문맥을 열어 두는 것이 좋습니다. 이것은 많은 수의 엔티티가로드되어 메모리에 보관되는 것을 방지하기위한 것입니다. 이렇게하면 클래스에서 전체적으로가 아니라 각 메서드에서 컨텍스트를 만들고 처리해야한다고 생각하게됩니다.

HTTP 요청의 지속 시간이 작기 때문에 전역 적으로 컨텍스트를 사용할 수 있어야 주요 오버 헤드가 발생하지 않으므로 매번 컨텍스트를 만드는 데 필요한 리소스가 매 요청의 지속 기간 동안 계속 유지되는 이점보다 중요합니다 .

이 답변은 webforms의 관점에서 볼 때, MVC 컨트롤러가 요청보다 오래 유지되고 다른 응답이 필요한 경우 100 %가 아닙니다.

핵심은 메모리의 엔티티 수가 증가함에 따라 응용 프로그램의 지속 기간 동안 정적 인 것으로 또는 문맥을 응용 프로그램의 지속 기간 동안 설정하려는 것이 아니라고 생각합니다.

IDisposable을 사용하는 블록을 명시 적으로 사용 블록에 두지 않는 것이 좋지 않은 아이디어라고 생각할 수 있습니다.

(면책 조항 : 추측 단락!) 여기서 페이지가 예외 또는 유사한 문제를 해결할 경우 리소스를 열어 둘 가능성이 확실하지 않습니다. 99.9 %의 시간은 괜찮을 거라고 생각하지만 리소스가 제대로 처리되지 않는 경우는 거의 없습니다.

관련 문제