2009-12-16 2 views
1

는 다음의 예를 보자언제 DataContext를 처리 할 수 ​​있습니까?

MyDataContext context = new MyDataContext(); // DB connection established. 
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

내 법인 내가

foreach (var record in MyEntity.RelatedTable)

내가 순서로 2 줄 끝에서 살아 내 DataContext를 유지해야합니까 통해 액세스하는 다른 테이블과의 관계를 가지고 말 엔티티의 속성에 액세스하거나 그것을 처분 할만큼 충분히 안전합니까?

Linq가 SQL 실행 지연을 사용한다는 것을 이해합니다. 따라서 엔티티를 처음 검색 할 때 지연된 실행 만 사용하는지 또는 관련된 테이블 레코드에도 액세스 할 때이 명령을 사용하는지 궁금합니다.

var userRepo = new UserRepository(); // creates new DataContext 
var auditRepo = new AuditRepository(); // creates new DataContext 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with the user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    auditRepo.Insert(audit); 
} 

내의 repo에 내 삽입 방법은 SubmitChanges를 호출합니다. 위의 내용이 수용 가능한지, 아니면 연결의 낭비입니까? 현실적으로해야 할 일 :

var userRepo = new UserRepository(); 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    user.Audits.Add(audit); 
    userRepo.Save(); 
} 

이미 열려있는 DataContext를 다시 사용 하시겠습니까? 상위 수준의 datacontext를 열고 낮은 수준의 처리를해야하는 상황에서 userRepo를 전달해야합니까? 아니면 별도의 리포지토리를 만들어야합니까?

답변

4

다른 테이블의 필드에 액세스하려면 DataContext를 활성 상태로 유지해야합니다. 또한 dispose를 직접 호출하지 마십시오. using 키워드를 사용하십시오.

using (MyDataContext context = new MyDataContext()) // DB connection established. 
{ 
    MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

    foreach (var record in MyEntity.RelatedTable) 
    { 
     ... 
    } 
} 
+0

repos를 사용할 때 using 문을 사용하는 것이 항상 좋은가? 내가 사용하고있는 커스텀 리포지터리를 만들었는데 때로는 문장을 사용하여 모든 코드를 래핑하는 것이 좋지 않은 것 같습니다. – James

+1

당신은 당신 만 작업하는 커스텀 코드를 가지고 있다는 것을 의미합니다. Dispose 호출을 생략하고 앞으로도 수행하지 않을 경우 필요한 것보다 오랜 시간 동안 자원을 보유 할 수 있습니까? 그런 다음 상황에 따라 사용하지 않는 것이 좋습니다.그러나 일반적으로 IDisposable을 구현하는 모든 객체에서 using을 호출하는 것이 좋습니다. 그렇지 않으면 가비지 컬렉터가 범위를 벗어나는 정리되지 않은 객체를 정리합니다. 그러나 가비지 수집기가 언제 실행되는지 언제 알지 못합니다. –

+1

네, 좋은 지적입니다. 고마워요. – James

3

가벼운 객체이고 모든 내부 db 연결이 캐시되므로 DataContext를 처리 할 필요가 없습니다. 처분 할 경우 관련 단체에 액세스 할 수 없습니다.

+0

그래서 L2S도 관련 엔티티에 액세스 할 때 지연 실행을 사용합니까? – James

+0

예, DataContext.LoadWith 메서드를 사용하지 않으면 지연 실행을 사용합니다. – tt83

+0

팁 주셔서 감사합니다! 이 옵션을 사용할 수 있다는 것을 깨닫지 못했습니다 – James

관련 문제