يقوم NHibernate بإنشاء وكيل عبر session.Load()، ولكن ليس عبر Linq أو Criteria API
-
10-07-2019 - |
سؤال
لدي مشكلة غريبة في مشروعي الحالي.التحميل البطيء للاستعلامات لا يعمل.عندما أقوم بالاستعلام عن قائمة، يقوم nhibernate بجلب كافة الارتباطات بشكل منفصل.
لقد استخرجت أجزاء صغيرة منه ووضعته في محلول منفصل.ما لدي الآن هو في الأساس جدول الحسابات وجدول AccountSync.كلاهما لهما معرف وعنوان URL، في حين أن المعرف هو مجرد db-guid.
فصولي هي:
public class HippoAccount
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccountSync Sync { get; set; }
}
public class HippoAccountSync
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccount Account { get; set; }
}
عندما أقوم الآن بتحميل كائن عبر دليله:
var account = session.Load<HippoAccount>(accountId);
Console.WriteLine(NHibernateUtil.IsPropertyInitialized(account, "Sync"))
...يعود false
والحساب نفسه وكيل.
ولكن عند تحميل قائمة عبر معايير API:
var account = (HippoAccount)session
.CreateCriteria(typeof (HippoAccount))
.Add(Restrictions.Eq("Id", accountId))
.List()[0];
...الملكية Sync
تتم التهيئة (إطلاق استعلام تحديد ثانٍ)، والكائن الذي تم إرجاعه ليس وكيلاً.
هل هذا هو السلوك الافتراضي؟ما الذي أخطئ فيه؟
رسم الخرائط هو:
<class name="HippoAccount" table="AllAccounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url" />
<many-to-one
class="HippoAccountSync"
name="Sync"
not-found="ignore"
property-ref="Url">
<column name="url" />
</many-to-one>
</class>
<class name="HippoAccountSync"
mutable="false"
table="Accounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url">
<column name="serviceUri" />
</property>
<many-to-one class="HippoAccount"
name="Account"
property-ref="Url"
not-found="ignore">
<column name="serviceUri" />
</many-to-one>
</class>
المحلول
وبعد المزيد من البحث، وجدت الإجابات.الإجابات، لأن هناك العديد من الأشياء التي يمكن أن تمنع التحميل البطيء في NHibernate.
الاستعلام مقابلتحميل الجلسة: عند جلب عنصر عبر
session.Load()
تحصل على وكيل.ولكن بمجرد الوصول أي الملكية، دعنا نقولUrl
, ، يتم جلب الكائن بما في ذلك جميع ارتباطاته التي لا تدعم التحميل البطيء.مرجع الملكية: التحميل البطيء يعمل فقط على معرف الكائن.عندما يتم حل اقتران خاصية عبر عمود مختلف في الكيان المستهدف، فإن NH يجلبه بفارغ الصبر. لا يعني ذلك أن هذا لن يكون ممكنًا، ولكنه لم يتم تنفيذه: حشرة
غير موجود = "تجاهل" يسمح غير صالح المفاتيح الخارجية، أي إذا لم يتم العثور على الكيان المشار إليه، فسوف يقوم NH ببدء الخاصية بقيمة خالية.لا يعترض NH الوصول إلى الخاصية من أجل التحميل البطيء، ولكنه يقوم بدلاً من ذلك بتعيين وكيل كائن.مع
not-found="ignore"
لا يمكن تحديد ما إذا كان يجب تعيين الخاصية على قيمة خالية أو وكيل للمفتاح الخارجي المحدد، والذي قد يكون غير صالح. ربما يمكن حل هذه المشكلة عن طريق اعتراض الوصول إلى الممتلكات.عند التعطيل
not-found="ignore"
وproperty-ref
قد يؤدي تصدير المخطط إلى إنشاء قيود تفرض مرجعًا دائريًا.ليس جيدا!سيكون التعيين الصحيح بعد ذلك عبارة عن علاقة مقيدة من رأس إلى واحد، حيث يكون المفتاح لـHippoAccountSync
يجب أن يكون لديك مولدforeign
.
موارد