سؤال

لدي تطبيق N-layered ASP.NET الذي يرجع كائنًا من dal إلى BAL مثل SO:

public IEnumerable<SourceKey> Get(SourceKey sk)
{
    var query = from SourceKey in _dataContext.SourceKeys
                select SourceKey;

    if (sk.sourceKey1 != null)
    {
        query = from SourceKey in query
                where SourceKey.sourceKey1 == sk.sourceKey1
                select SourceKey;
    }

    return query.AsEnumerable();
}

تمر هذه النتيجة عبر طبقة العمل الخاصة بي وتضرب طبقة واجهة المستخدم لعرضها على المستخدمين النهائيين. أنا لا أحمل كسول لمنع تنفيذ الاستعلام في طبقات أخرى من طلبي.

لقد قمت بإنشاء وظيفة أخرى في DAL لحذف الكائنات:

public void Delete(SourceKey sk)
{
    try
    {
        _dataContext.DeleteObject(sk);
        _dataContext.SaveChanges();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message + " " + ex.StackTrace + " " + ex.InnerException);
    }
}

عندما أحاول الاتصال بـ "Delete" بعد استدعاء وظيفة "Get" ، أتلقى هذا الخطأ:

المعاملة الجديدة غير مسموح بها لأن هناك مؤشرات ترابط أخرى تعمل في الجلسة

هذا هو تطبيق ASP.NET. يحتوي DAL الخاص بي على نموذج بيانات الكيان. يشترك الفئة التي لديّ وظائف أعلاه في نفس _datacontext ، والتي تم إنشاء مثيل لها في مركزي. أظن أن القارئ لا يزال مفتوحًا من وظيفة "GET" ولم يتم إغلاقه. كيف يمكنني إغلاقه؟

في طبقة واجهة المستخدم الخاصة بي ، أحلق النتائج وأحاول حذفها على النحو التالي:

foreach(SourceKey sk in skm.Get(new SourceKey()))
{
    Debug.WriteLine(sk.sourceKey1);

    skm.Delete(sk);
}

يحرر

يحدث الخطأ على هذا السطر:

_dataContext.DeleteObject(sk);
هل كانت مفيدة؟

المحلول

أظن أن هذا يتعلق بمعالجة الاستعلام بواسطة LINQ. أظن أنه يعتمد على المقالات التي قرأتها في الماضي ، لكنني أعتقد أن استفسارك يتم تنفيذه بتكاسل - يتم فتح الاستعلام من النقطة التي يتم فيها استخدام العداد لأول مرة (الأول MoveNext اتصل) ، وليس مغلقًا حتى يكتمل التعداد.

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

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