代码之家  ›  专栏  ›  技术社区  ›  Rune Grimstad

确定Linq到Sql查询的源DataContext

  •  4
  • Rune Grimstad  · 技术社区  · 16 年前

    DataContext.SubmitChanges();

    有没有办法确定查询来自哪个DataContext?DataQuery类本身被标记为internal,因此我无法访问它的上下文属性而不诉诸丑陋的反射黑客,因此我正在寻找一种更干净的方法。

    有(几种)方法可以解决这个问题,例如传递对源DataContext的引用,但我想一定有一种更简单的方法可以做到这一点。

    编辑: 下面的代码可以工作,但很难看:

    FieldInfo contextField = query.GetType().GetField("context", BindingFlags.Instance | BindingFlags.NonPublic);
    if (query != null)
    {
      queryContext = contextField.GetValue(value) as DataContext;
    }
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Andrew Morton    4 年前

    是-使用反射是确定查询所属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
    

    如果这有帮助,请在这篇文章上投票。

    有关使用反射查找事件处理程序的详细信息:

        2
  •  0
  •   Marc Gravell    16 年前