2009-12-21 4 views
3

Linq-to-Sql 사용 :Linq 개체가 데이터 컨텍스트에 연결되었는지 확인하는 방법?

MyClass obj; 
... 
// need to delete this object 
dataContext.GetTable(obj.GetType()).DeleteOnSubmit(obj); 

BUT

obj 데이터 컨텍스트에 연결되어 있는지 여부를 알 수 없습니다. 그리고 그렇지 않다면, DeleteOnSubmit에 대한 마지막 호출은 예외를 던집니다.

objdataContext에 부착되었는지 여부를 쉽게 알 수있는 방법이 있어야합니다. 그러나 나는 명백한 것을 볼 수 없습니다.

어떻게 할 수 있습니까?

+0

Linq to SQL 또는 Entity Framework를 사용하고 있습니까? –

+0

Linq2Sql - 편집 된 질문 –

답변

4

당신의 디자인을보고 싶을 지 모르지만, 이런 종류의 것들은 당신이 결정 론적으로 알아낼 수 있어야하기 때문에 가능합니다.

불행하게도, 객체가 첨부되었는지 (L2S의 내부 명칭에서 "추적 됨") 정확한 호출은 인 Context.Services.ChangeTracker.GetTrackedObject으로 전화해야합니다. 내가 볼 수있는 가장 가까운 것은 해당 엔터티를 전달하는 Table.GetOriginalEntityState입니다. 반환 값이 null이면 객체가 untracked (연결되지 않음)입니다. 반환 값이 null이면 개체가 추적됩니다 (연결됨).

실제로 이것을 테스트하지는 않았지만 Reflector의 코드를 보면이 코드가 효과가 있다는 인상을줍니다.

+0

+1 + 답 신용 - 감사합니다. –

0

Link2SQL, 그렇다고 생각하십니까? 이것은 코드에서 분명해야합니다. 런타임시 상태를 동적으로 쿼리해야합니까? obj는 dataContext에서 가져온 경우에만 첨부됩니다.

나는 similar question a while ago에게 물었습니다. 로버트 하비의 의견이 도움이 될지도 모른다.

+1

올바르지 않습니다. 또한 객체를 인스턴스화하여 컨텍스트에 첨부 할 수도 있습니다. –

+0

예 - Linq2Sql - 죄송합니다. 질문이 업데이트됩니다. 답안 파트 2의 경우 : 코드가 작성되는 컨텍스트에서 개체가 매개 변수로 전달되며 데이터 컨텍스트에 이미 첨부되어 있는지 여부를 알 수있는 직접적인 방법이 없습니다. 어떤 가정도 할 수 없다. –

+0

Linq와 함께 작업하는 가장 좋은 방법은 로컬 범위에서만 데이터 조작을 수행한다는 사실을 마침내 받아들이 기 전까지는 많은 노력을 기울였습니다. 예를 들어 세션에서 웹 응용 프로그램의 포스트 백에서 살아남을 때와 같이 객체가 더 넓은 범위를 필요로하는 경우 더블 버퍼링을 사용합니다. 즉, 분리 객체가 생기면 데이터베이스에서 새 버전을 가져 와서 회원들을 업데이트하기 전에. 이렇게하면 이러한 종류의 문제가 완화됩니다. – cdonner

0

개체가 데이터 컨텍스트에 연결되어 있는지 확인할 수있는 한 가지 방법은 PropertyChanging 및 PropertyChanged 이벤트를 확인하는 것입니다. 이 두 가지 속성이 null이 아닌 경우


public virtual void Detach() 
{ 
    PropertyChanging = null; 
    PropertyChanged = null; 
}

따라서, 물체가 부착되어

나는 다음과 같이 그들을 떼어 내 실체의 방법이있다.

랜디

+0

불행히도 클래스 내에서 코딩하지 않으면이 기능이 작동하지 않습니다. 자손도이 방법을 사용할 수 없습니다. –

관련 문제