Frage

In meiner Anwendung habe ich mehrere Datacontexts, die mit verschiedenen Schemata zu verschiedenen Datenbanken verbinden. In einer benutzerdefinierten Benutzersteuerung angezeigt werden wir die Ergebnisse der Abfrage und lassen die Benutzer bearbeiten, und wenn der Benutzer die Daten bearbeitet mag ich die Änderungen in die Datenbank persistieren. Zu tun, dass ich einen Verweis auf die Quelle Datacontext benötigen (oder zumindest die Quelle Datacontext-Typ), so kann ich eine DataContext.SubmitChanges(); tun

Gibt es eine Möglichkeit zu bestimmen, welche Datacontext eine Abfrage herkommt? Die Dataquery Klasse selbst wird als interne markiert, so kann ich es nicht Kontexteigenschaft zuzugreifen, ohne Hacks hässliche Reflexion zurückgreifen, so dass ich bin auf der Suche für eine sauberere Ansatz.

Es gibt (mehr) Möglichkeiten, um dieses Problem auf einem Verweis auf die Datacontext-Quelle zum Beispiel vorbei, aber ich glaube, es muss ein einfacher Weg, dies zu tun.

Edit: Der folgende Code funktioniert, aber es ist hässlich:

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

Lösung

Ich denke, du wirst einfach haben, um die Datacontext auf den Code (manuell) übergeben. Es tut uns Leid.

Andere Tipps

Ja - mithilfe von Reflektion ist über die einzige Möglichkeit, die Datacontext zu bestimmen, die Abfrage gehört. Es ist das gleiche mit der Data Objects, die erstellt werden, wenn die Abfrage ausgelöst wird.

Was Frage nicht streng beantworten Rune folgt, kann aber hilfreich sein, wenn Sie Reflektion verwenden möchten, ob ein Datenobjekt zu bestimmen, wie angebracht und überwacht durch einen Datenkontext:

Der folgende Code definiert eine Context-Eigenschaft, die auf ein Datenobjekt platziert werden kann, und dann verwendet, um das Datacontext zurückzukehren (falls vorhanden), daß das Objekt befestigt ist.

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

Achten Sie darauf, zu beachten, dass das Objekt nur es ist Datacontext orten kann, wenn sie gerade mit dem Kontext verbunden ist mit ChangeTracking eingeschaltet. Diese Eigenschaft beruht auf der Tatsache, dass die Datacontext an die OnPropertyChanging Veranstaltung Objekt abonniert hat, verändert sich über die Lebensdauer des Objekts zu überwachen.

Wenn das ist hilfreich, bitte up-Abstimmung dieses Beitrag.

Für weitere Informationen über Reflexion mit Event-Handler zu finden: http: //weblogs.asp. net / avnerk / Archiv / 2007/03/29 / reflektierende-over-an-event.aspx http://www.bobpowell.net/eventsubscribers.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top