문제

내 응용 프로그램에는 다른 스키마가있는 다른 데이터베이스에 연결하는 몇 가지 DataContexts가 있습니다. 사용자 정의 사용자 컨트롤에서 쿼리 결과를 표시하고 사용자가 편집하고 사용자가 데이터를 편집하면 데이터베이스 변경 사항을 지속하려고합니다. 이를 위해서는 소스 DataContext (또는 적어도 소스 Datacontext 유형)에 대한 참조가 필요하므로 DataContext.SubmitChanges();

쿼리가 어떤 데이터 컨텍스트에서 나오는지 결정하는 방법이 있습니까? DataQuery 클래스 자체는 내부로 표시되므로 추악한 반사 해킹에 의지하지 않고는 컨텍스트 속성에 액세스 할 수 없으므로 더 깨끗한 접근 방식을 찾고 있습니다.

예를 들어 소스 Datacontext에 대한 참조를 따라이 문제에 대한 몇 가지 방법이 있지만,이를 수행하는 더 간단한 방법이 있어야한다고 생각합니다.

편집 : 다음 코드는 작동하지만 추악합니다.

FieldInfo contextField = query.GetType().GetField("context", BindingFlags.Instance | BindingFlags.NonPublic);
if (query != null)
{
  queryContext = contextField.GetValue(value) as DataContext;
}
도움이 되었습니까?

해결책

나는 당신이 단순히 데이터 콘텍스트를 코드에 전달해야한다고 생각합니다 (수동으로). 죄송합니다.

다른 팁

예 - 반사를 사용하는 것은 쿼리가 속하는 데이터 콘텍스트를 결정하는 유일한 방법입니다. 쿼리가 트리거 될 때 생성 된 데이터 객체와 동일합니다.

다음은 Rune의 질문에 엄격히 답변하지 않지만 반사를 사용하여 데이터 컨텍스트에 첨부 및 모니터링되는 데이터 객체를 결정하려면 도움이 될 수 있습니다.

다음 코드는 데이터 객체에 배치 할 수있는 컨텍스트 속성을 정의한 다음 객체가 첨부 된 데이터 콘텍스트 (있는 경우)를 반환하는 데 사용됩니다.

Private Const StandardChangeTrackerName As String = "System.Data.Linq.ChangeTracker+StandardChangeTracker"

Private _context As DataClasses1DataContext
Public Property Context() As DataClasses1DataContext
    Get
        Dim hasContext As Boolean = False
        Dim myType As Type = Me.GetType()
        Dim propertyChangingField As FieldInfo = myType.GetField("PropertyChangingEvent", BindingFlags.NonPublic Or BindingFlags.Instance)
        Dim propertyChangingDelegate As PropertyChangingEventHandler = propertyChangingField.GetValue(Me)
        Dim delegateType As Type = Nothing

        For Each thisDelegate In propertyChangingDelegate.GetInvocationList()
            delegateType = thisDelegate.Target.GetType()
            If delegateType.FullName.Equals(StandardChangeTrackerName) Then
                propertyChangingDelegate = thisDelegate
                hasContext = True
                Exit For
            End If
        Next

        If hasContext Then
            Dim targetField = propertyChangingDelegate.Target
            Dim servicesField As FieldInfo = targetField.GetType().GetField("services", BindingFlags.NonPublic Or BindingFlags.Instance)
            If servicesField IsNot Nothing Then

                Dim servicesObject = servicesField.GetValue(targetField)

                Dim contextField As FieldInfo = servicesObject.GetType.GetField("context", BindingFlags.NonPublic Or BindingFlags.Instance)

                _context = contextField.GetValue(servicesObject)

            End If
        End If

        Return _context
    End Get
    Set(ByVal value As DataClasses1DataContext)

        _context = value

    End Set

End Property

객체는 현재 Changetracking이 켜진 상태에서 컨텍스트에 첨부 된 경우에만 데이터 콘텍스트 만 찾을 수 있습니다. 이 속성은 Datacontext가 객체의 수명 동안 변경 사항을 모니터링하기 위해 객체의 onpropertychanging 이벤트에 가입했다는 사실에 의존합니다.

이것이 도움이된다면이 게시물을 발표하십시오.

반사를 사용하여 이벤트 핸들러를 찾으려면 :http://weblogs.asp.net/avnerk/archive/2007/03/29/reflecting-over-an-event.aspx http://www.bobpowell.net/eventsubscriber.htm

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top