Bestimmen Sie die Quelle Datacontext für eine Linq to SQL-Abfrage
-
11-07-2019 - |
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;
}
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