2009-11-06 1 views
2

Linq2sql을 사용할 때 모든 것이 자동으로 작동합니다. 내 경험으로는 흐름이 항상 최상의 솔루션은 아니며 내부적으로 작동하는 방식을 이해하는 것이 더 좋으므로이 기술을 최적으로 사용하십시오.linq2sql은 데이터베이스 객체를 어떻게 추적합니까?

내 질문은 linq2sql에 관한 것입니다.

쿼리를 수행하여 일부 데이터베이스 개체를 얻거나 새 개체를 만들면 linqcontext 개체가 이러한 개체에 대한 참조를 유지합니다. 객체 중 하나에서 무언가가 변경되면 컨텍스트 객체는 변경된 내용과 업데이트가 필요한 내용을 알 수 있습니다.

개체에 대한 내 참조가 null로 설정된 경우 컨텍스트 개체가이 개체에 대한 링크도 제거한다는 의미입니까? 또는 컨텍스트 개체가 천천히 많은 참조로 채워지고 데이터베이스 개체가 가비지 수집에서 유지됩니까?

그렇지 않은 경우 어떻게 작동합니까 ??

또한 데이터베이스 개체가 항상 전체 목록을 검토하여 변경된 내용을 확인하고 업데이트하는 데 시간이 많이 걸리지는 않습니까?

이 작동 방식에 대한 통찰력은 탁월합니다!

감사합니다.

+0

linq –

+0

marcel의 맛에 고유하므로 질문에 "linq-to-sql"태그를 추가해야합니다. 좋은 생각 – Toad

+0

나를 오해하고 이미 "linq-to-sql"태그가 있습니다. 당신은 방금 새로운 태그를 만들었습니다 ;-) –

답변

2

예, 컨텍스트는로드 된 개체의 참조를 유지합니다. 이것이 다른 요청에 대해 공유되는 단일 인스턴스와 함께 사용하도록되어 있지 않은 이유 중 하나입니다.

삽입/삭제 목록을 유지합니다. 목록에 추가 된 업데이트를 캡처하는지 아니면 마지막에 반복되는지 확실하지 않습니다. 하지만 한 번에 많은 양의 데이터를로드해서는 안됩니다. 그 이유만으로도 목록에서 수행 할 수있는 마지막 검사보다 실적에 큰 타격을 입힐 수 있기 때문입니다.

+0

서로 다른 요청에 대한 공유는 무엇을 의미합니까? 모든 쿼리에 대해 새로운 컨텍스트를 만들겠습니까? – Toad

+0

@reinier 그게 asp.net에있어 (귀하의 경우되지 않을 수도 있습니다), 다른 요청에 대해 동일한 컨텍스트 인스턴스를 유지하면 u는 거기에있는 모든 추적 된 개체를 유지합니다.성능 외에도 일부 프로세스가 일부 db 개체에서 일부 변경을 수행하고 일부 유효성 검사로 인해 변경 사항을 제출하지 않은 경우 ... 다른 프로세스에서 관련이없는 변경 및 컨텍스트에서 변경 사항 제출 요청 - - 의도하지 않은 다른 변경 사항을 커밋합니다. – eglasius

+0

예, 가능한 한 짧은 Dataacontext 수명주기를 유지하는 것이 좋습니다. –

2

DataContext는 개체를 PropertyChanged 이벤트에 등록하여 수정시기를 알려줍니다. 이 시점에서 원본 개체를 복제하고 나중에 SubmitChanges() 할 때 두 개체를 함께 비교할 수 있도록 유지합니다.

개체에 대한 내 참조가 null로 설정된 경우 컨텍스트 개체가이 개체에 대한 링크도 제거한다는 의미입니까?

편집 : 아니요 죄송합니다 내 원래의 대답을 당신이 쓴 무엇을 잘못 해석했다. 이 경우 데이터 컨텍스트는 여전히 두 개체에 대한 참조를 가지고 있지만 다음 두 개체와의 관계는 제거됩니다 (SubmitChanges()).

비록주의해야합니다. .dbml에서 생성 된 개체 대신 자신의 개체를 만든 경우 datacontext가 수행하는 "마법"이 제대로 작동하지 않을 수 있습니다.

+0

개체 만들기와 함께 내 테이블에서 dbml을 만들었습니다. – Toad

+0

@Marcel afaik 개체 참조를 null로 설정하면 참조되지 않은 개체가 제거되지 않습니다. – eglasius

+0

감사합니다 프레디, Visual Studio에서 만든 개체를 사용한 이후 내 대답 –