سؤال

وهذا هو في بيئة تطبيق ويب:

وطلب مبدئي قادر على إكمال بنجاح، ولكن أي طلبات إضافية بإرجاع "الدورة غير مغلق" ردا من إطار NHibernate. أنا باستخدام نهج HttpModule مع التعليمات البرمجية التالية:

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += ApplicationEndRequest;
        context.BeginRequest += ApplicationBeginRequest;
    }

    public void ApplicationBeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession());
    }

    public void ApplicationEndRequest(object sender, EventArgs e)
    {
        ISession currentSession = CurrentSessionContext.Unbind(
            SessionFactory.Instance);

        currentSession.Dispose();
    }

    public void Dispose() { }
}

وSessionFactory.Instance هو تنفيذ بلدي المفرد، وذلك باستخدام FluentNHibernate للعودة كائن ISessionFactory.

في صفي مستودع، وأنا حاولت استخدام بناء الجملة التالي:

public class MyObjectRepository : IMyObjectRepository
{
    public MyObject GetByID(int id)
    {
        using (ISession session = SessionFactory.Instance.GetCurrentSession())
            return session.Get<MyObject>(id);
    }
}

وهذا يسمح التعليمات البرمجية في التطبيق ليتم استدعاؤها على هذا النحو:

IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);

ولدي شكوك قانون بلدي المستودع هو المسؤول، لكنني لست متأكدا 100٪ عن التنفيذ الفعلي وأرجو أن تستخدم.

ولقد وجدت مشكلة مشابهة على href="https://stackoverflow.com/questions/1103837/nh-request-per-session-session-is-closed"> . أنا أيضا باستخدام WebSessionContext في تنفيذ بلدي، ومع ذلك، لم يقدم أي حل آخر غير الكتابة مخصص SessionManager. للعمليات الخام بسيطة، هي المزود جلسة مخصصة المطلوبة بصرف النظر عن المدمج في الأدوات (أي WebSessionContext)؟

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

المحلول

وأنا لم تختبر التعليمات البرمجية الخاصة بك، ولكن من القراءة، وهذا السطر:

using (ISession session = SessionFactory.Instance.GetCurrentSession())

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

وهنا هو النموذج الذي نستخدمه في تطبيقاتنا:

ISession session = null;

try
{
    // Creates a new session, or reconnects a disconnected session
    session = AcquireCurrentSession();

    // Database operations go here
}
catch
{
    session.Close();
    throw;
}
finally
{
    session.Disconnect();
}

نصائح أخرى

وحصلت على خطأ مماثل. تبين لي كان "الجديدة" جي تصل رسالتي مستودع بدلا من الاضطرار بلدي IOC حاوية حل ذلك.

واستخدام العبارة التالية يتصرف خارج أو إغلاق جلسة بعد كل الاستعلام:

using (ISession session = SessionFactory.Instance.GetCurrentSession())

وبدلا من ذلك استخدامها دون "باستخدام" كلمة على النحو التالي:

ISession session = SessionFactory.Instance.GetCurrentSession()

وهذا عمل بالنسبة لي.

scroll top