2009-12-17 3 views
2

나는 일을하는 가장 좋은 방법을 알아 내려고 노력하면서 DataContext의 수명을 조금 공부했다.Linq to SQL - 데이터베이스 요청을 어떻게 관리해야합니까?

웹 응용 프로그램에서 내 DAL을 다시 사용하고자한다면 비즈니스 개체 요청 당 DataContext 접근 방식을 사용하기로 결정했습니다.

제 아이디어는 데이터베이스가 요청 당 별도의 컨텍스트를 만드는 정보를 검색하기 위해 dbml 파일에서 L2S 엔티티를 확장하는 것입니다.

엔터티를 반환 측면에서
public partial class AnEntity 
{ 
    public IEnumerable<RelatedEntity> GetRelatedEntities() 
    { 
     using (var dc = new MyDataContext()) 
     { 
      return dc.RelatedEntities.Where(r => r.EntityID == this.ID); 
     } 
    } 
} 

는 ... 쿼리에서 반환 나는이 시점에서 포항 강판을 반환해야하거나 단순히 비즈니스 오브젝트를 반환 할 괜찮합니까? 나는 DataContext가 삭제 된 후에 반환 된 엔티티의 속성에 액세스하려고하면 실패 할 것이라고 생각합니다. 그러나 이것이 내가 이러한 유형의 메소드를 구현하기로 결정한 이유입니다.

대신에 : 이론적으로

AnEntity entity = null; 
using (var repo = new EntityRepo()) 
{ 
    entity = repo.GetEntity(12345); 
} 
var related = entity.RelatedEntities; // this would cause an exception 

내가 할 수 있어야한다 :

AnEntity entity = null; 
using (var repo = new EntityRepo()) 
{ 
    entity = repo.GetEntity(12345); 
} 
var related = entity.GetRelatedEntities(); 

내 특정 응용 프로그램의 상황을 감안할 때 나는 (Windows 서비스 & 웹 응용 프로그램에서 작업 할 필요가있다) 명백한 결함이 있는지, 그리고 내가 무엇을하려고 노력하고 있는지에 대한 더 나은 접근법이 있는지를 알기를 원합니다.

감사합니다.

+0

피할 수있는 스레드 관련 문제는 무엇입니까? – Nate

+0

이 글에 자세히 설명되어 있습니다. http://www.west-wind.com/weblog/posts/246222.aspx – James

+0

너무 많이 방해 받기를 원하지 않으므로이 글을 원래 게시물에서 삭제했습니다.하지만 기본적으로 웹 응용 프로그램과 같은 다중 스레드 환경에서 내 DAL에 액세스하려는 경우 충돌을 피하려고합니다. – James

답변

1

일반적으로 하나 이상의 스레드를 사용하여 단일 DataContext 개체를 호출하지 않는 한 확인해야합니다. 즉, 스레드 당 하나의 DataContext 객체를 사용하고 서로 다른 DataContext 객체간에 데이터 또는 상태를 공유하지 마십시오.

나머지 멀티 스레드 문제는 스레딩 작업이 아닌 데이터베이스에서 concurrency과 관련이 있습니다.

이러한 경고 이외에는 접근 방식이 정상적인 것으로 보입니다. 부분 클래스를 사용하여 비즈니스 메소드를 구현하거나 Linq to SQL 클래스와 저장소 사이에 비즈니스 계층을 추가 할 수 있습니다.

+0

내 특정 응용 프로그램에서는 동시성에 대해 걱정할 필요가 없습니다. 아마도 멋진 비즈니스 계층이 L2S 엔티티를 확장하는 것보다 더 나은 접근 방법이라고 생각합니다. 그래서 DataContext 사용 측면에서 원자 함수 당 1을 만드는 것은 상당히 수용 가능한 것입니다. – James

+0

그것이 내가하는 일입니다. "작업 단위"당 하나. –

1

이 멀리 얻을 수 있습니다 :

var repo = new EntityRepo(); 

entity = repo.GetEntity(12345); 

var related = entity.RelatedEntities; 

그런 연결 누수 또는 물건을 발생하지 않는 상황을 폐기하지 이유에 대한 설명은 this StackOverflow post를 참조하십시오.

가비지 수집기가 가져온 엔티티가 범위를 벗어나면 리포지토리 및 컨텍스트가 정리됩니다 (요청이 끝나면 웹 사이트를 작성할 때).

: MSDN documents : 연결은 가능한 한 늦게 열리고 최대한 빨리 닫으십시오. 따라서 using을 건너 뛰어도 연결 풀 문제가 발생하지 않습니다.

+0

GC가 실행될 때 보증인이 없으므로 일반적으로 using 문에 IDisposable을 구현하는 모든 객체를 래핑하는 것이 좋습니다. – James