在我的应用我有几个DataContexts连接到与不同架构不同的数据库。在自定义用户控制I显示查询的结果,并让用户对其进行编辑,当用户编辑数据我想将更改保存到数据库中。为了做到这一点,我需要的源的DataContext(或至少所述源的datacontext类型)的参考,所以我可以做一个DataContext.SubmitChanges();

有没有什么办法来确定哪些DataContext的查询从何而来?该DataQuery类本身被标记为内部的,所以不诉诸丑陋反射黑客无法访问其上下文属性,所以我在寻找一个更简洁的方法。

有解决这个问题(几)的方式,一起源的DataContext的实例的引用传递,但我想一定有做这个简单的方法。

编辑: 下面的代码工作,但它的丑陋:

FieldInfo contextField = query.GetType().GetField("context", BindingFlags.Instance | BindingFlags.NonPublic);
if (query != null)
{
  queryContext = contextField.GetValue(value) as DataContext;
}
有帮助吗?

解决方案

我认为你将不得不简单地在DataContext传递到代码(手动)。遗憾。

其他提示

是 - 使用反射即将确定该查询属于在DataContext的唯一途径。这是与查询被触发时创建该数据对象是相同的。

接下来并不严格回答符文的问题,但如果你想使用反射来确定是否一个数据对象连接到并通过数据上下文监控可能会有所帮助:

下面的代码定义可被放置到数据对象,然后用于返回DataContext的(如果有的话),该对象附加到。一个Context属性

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

小心注意,对象只能找到它的DataContext的,如果它当前连接到上下文与ChangeTracking接通。此属性依赖于以下事实:在DataContext已经订阅了该对象的OnPropertyChanging事件来监视在所述对象的寿命的变化。

如果这是有帮助的,请赞成票这个帖子。

有关使用反射来找到事件处理程序的详细信息: HTTP://weblogs.asp。净/ avnerk /存档/ 2007/03 /第29 /反映-过的,event.aspx http://www.bobpowell.net/eventsubscribers.htm

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top