خطأ LINQ إلى SQL: "لا يمكن تنفيذ العملية أثناء مكالمة إلى Submitchanges."

StackOverflow https://stackoverflow.com/questions/4075367

سؤال

حسنًا ، لذلك أحصل على هذا الخطأ من السطور:

  System.Data.Linq.DataContext.CheckNotInSubmitChanges() +42
  System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +54

ما أفعله هو تتبع حالة التطبيق وتسجيل كل طلب. يقوم التطبيق بإخراج الإخراج في JSON و XML و HTML.

الشيء هو الخطأ غير منتظم. يحدث فقط كل عدد قليل من الطلبات. بدأ الخطأ يحدث عندما بدأت في تقديم طلبات AJAX. لقد تمكنت من تحديد أن الخطأ يحدث بشكل متكرر مع الطلبات السريعة (أي إذا قمت بالنقر فوق رابط بشكل متكرر).

أقوم بإنشاء مثيل منفصل من DataContext في كل مرة أتصل فيها بالخدمة التي ترمي الخطأ. أواجه صعوبة في معرفة ما هي المشكلة هنا ، وسأقدر حقًا أي إرشادات و/أو شرح لما يحدث. شكرًا لك.

* تعديل : **

 [InvalidOperationException: The operation cannot be performed during a call to SubmitChanges.]
    System.Data.Linq.DataContext.CheckNotInSubmitChanges() +80
    System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +73
    Magic.Model.Sessions.SqlXmlSessionStore.SubmitChanges() in SqlXmlSessionStore.cs:17
    Magic.Model.Sessions.SqlXmlSessionStore.UpdateSession(Session session) in SqlXmlSessionStore.cs:64
    Magic.Web.SessionService.OpenSession(MagicRequestContext requestContext) in SessionService.cs:36
    Magic.Web.SessionService.Magic.Model.Sessions.ISessionService.OpenSession(IRequestContext requestContext) in SessionService.cs:23

الطرق المذكورة هي:

private bool SubmitChanges()
{
   _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
   return _sqlContext.ChangeConflicts.Count == 0;   
}

public bool UpdateSession(Session session)
{
   var record = _sqlContext.SessionRecords.Single(x => x.SessionId == session.Key);
   _converter.PopulateRecordData(session, record);
   return SubmitChanges();
}

جميع فئة خدمة الجلسة هي استدعاء sqlxmlsessionstore.updatesession (الجلسة) إذا كانت الجلسة في DB ونشطة ، أو sqlxmlsessionstore.insertsession (الجلسة) إذا كان الطلب جديدًا وكان معرف الجلسة مفقودًا أو فريدًا.

حاولت إنشاء مثيل جديد من dataContext في كل مرة أقوم فيها بمجموعة فرعية () ، لكن ذلك أدى إلى عدم وجود كائن اتصال ، حتى عندما أسحب نفس Conn. سلسلة من الإعدادات. هل يمكن أن يكون هذا شيء له علاقة مع الجهاز المحلي الخاص بي؟

حسنًا ، لقد فعلت شيئًا يعمل ، لكنني لست متأكدًا مما إذا كانت هناك مشكلة في هذا الأمر لا أتوقع.

أسمح فقط لـ DataContext بإرسال مرة واحدة. لقد أنجزت هذا عن طريق تغيير رمز submitchanges () إلى:

    private bool _canSubmit = true;

    bool SubmitChanges(){
        if(_canSubmit)
        {
            _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
            _canSubmit = false;
            return _sqlContext.ChangeConflicts.Count == 0;      
        }
        return false;
     }

لا يزال هذا بمثابة وسيلة مخترقة للغاية حتى يعمل هذا ، وأود الوصول إلى أسفل المشكلة ، لذا يرجى تقديم المشورة إذا كان لدى أي شخص أي فكرة عن كيفية إصلاح هذا.

هل كانت مفيدة؟

المحلول 2

لم تكن هناك طريقة لمعرفة ذلك من رسالتي ، لكنني وجدت المشكلة. قمت بإعداد حقن التبعية في httpmodule ، وكان هناك قفل على وظيفة التكوين. أعتقد أنه كان هناك من الكود القديم الذي قمت بنسخه (ثم نسيته) من مكان ما عندما كنت أتعلم أولاً كيفية استخدام الهيكل. أزلت القفل وعملت. (حسنًا ، على الأقل بدأت توليد أخطاء جديدة غير ذات صلة).

أوه ، والسبب الذي يجعله يؤثر على datacontext هو أن الفئات التي لفت مثيلات datacontext كانت داخل القفل.

نصائح أخرى

لا يمكنك تغيير التغيير الذي تم تعيينه داخل Submitchanges ولا يمكنك استدعاء Submitchanges في الأساليب المرتفعة للفئات الجزئية. أظن أنك تفعل هذا ، لكنني لا أتبع شظايا الكود الخاصة بك تمامًا.

تعديل

لا أفهم كيف يتم إدارة عمر DataContext. في الجزء الأول من السؤال الذي تقوله

أقوم بإنشاء مثيل منفصل من datacontext في كل مرة أتصل فيها بالخدمة

ولكن في الجزء الثاني تقول

حاولت إنشاء مثيل جديد من dataContext في كل مرة قمت فيها بموجب subcitchanges () ، لكن ذلك أدى إلى عدم وجود كائن اتصال

الشيء التالي الذي لا أفهمه هو كيف أن الطريقة التي تم تغييرها والتي تستدعي submitchanges بمجرد عملها فقط ، لأنه يتجاهل أي تغييرات على البيانات التي تم إجراؤها بعد المكالمة الأولى ، يجب ألا تكون إما تسجيل جميع بياناتك أو أي مكالمة بعد المكالمة الأولى لتقديم التغييرات غير مطلوبة.

أساليب مثيل DataContext ليست آمنة مؤشر ترابط ، لا يمكنك وضعها في متغير عالمي في بدء التطبيق (هل تفعل ذلك؟) ؛ عادةً ما تريد dataContext جديد لكل طلب HTTP ، والذي يمكنك القيام به باستخدام انعكاس إطار التحكم أو فقط في التعليمات البرمجية ، و New DataConext في بداية الطلب وإرسال الاتصالات في النهاية.

هناك تقنية أخرى تتمثل في استخدام العديد من DataContexts ، وإنشاء datacontext ، وإجراء التغييرات ، واتصل إرسال chnages ، وتجاهل dataContext ، إنه خفيف الوزن للغاية. لا تحتاج غالبًا إلى استدعاء تغييرات إرسال أكثر من مرة ، والوقت الوحيد الذي قمت فيه بالتحكم في ترتيب تنفيذ عبارات SQL.

سيكون من الجيد إذا تمكنت من بناء مثال بسيط ونشر الكود بأكمله.

أقترح عليك إرفاق مصحح تصحيح وتلتقط الاستثناء في القانون. من هناك يجب أن تكون قادرًا على تتبع من أين يأتي.

بدلا من ذلك ، تجاوز SubmitChanges وقم بتسجيل stacktrace على الاتصال على أي وقت مضى لتتبع النسخة الأصلية للخطأ.

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