سؤال

باستخدام Castle activerecord، تعثرت في مشكلة عند التحميل الكسول.

الأعمال التالية (من الواضح)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

منذ أن أحتاج إلى تعديل مرشحات الجلسة في سياق معين (باستخدام اعتراضي)، أقوم بإنشاء ستيسريون جديد.

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

يلقي السطر الأخير "GOADUSER.GROUPS" أن LazyinitializationException: "فشل في تهيئة مجموعة من الدور: المجموعات، لم يتم إغلاق أي جلسة أو جلسة".

ومع ذلك، تعمل جميع عمليات الجلسة الأخرى بشكل صحيح. لذلك يبدو أن "ANDUSER" مرتبط بالجلسات الحسنة التي تم التخلص منها الآن. لماذا ا؟ وكيف يمكن حل هذا بدلا من ذلك؟

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

المحلول

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

نصائح أخرى

أعتقد أن هذه هي الطريقة التي يعمل بها nhibernate.

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

النطاق الداخلي لا يختلف عن الخارجي؛ لا يدعم التحميل كسول خارج هذا النطاق أيضا.

ومع ذلك، يمكنك العمل حول هذا القيد، إذا خدعت أحمق في تحميل حريصة داخل نطاقك الداخلي. بدلا من ذلك، اتصل .ToList() أو مماثلة في المجموعات التي ترغب في العمل بها، قبل الخروج من النطاق وسوف تكون البيانات متاحة أيضا في الخارج.

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