تحديد DataContext المصدر لينق إلى استعلام SQL
-
11-07-2019 - |
سؤال
في طلبي لدي العديد 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 (إن وجدت) التي يتم تركيبها على الكائن.
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