سؤال

في طلبي لدي العديد 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top