احتمالا مطلب "
دات نت 4 و کلاس Lazy" را پیشتر مطالعه کردهاید. هر چند NHibernate 3.0 بر اساس دات نت فریم ورک 3 و نیم تهیه شده، اما شبیه به این مفهوم را در مورد بارگذاری به تاخیر افتادهی مقادیر خواص یک کلاس که به ندرت مورد استفاده قرار میگیرند، پیاده سازی کرده است. Lazy را در اینجا تنبل، به تعویق افتاده، با تاخیر و شبیه به آن میتوان ترجمه کرد؛ خواص معوقه!
برای مثال فرض کنید یکی از خواص کلاس مورد استفاده، متن، تصویر یا فایلی حجیم است. در مکانی هم که قرار است وهلهای از این کلاس مورد استفاده قرار گیرد نیازی به این اطلاعات حجیم نیست؛ با سایر خواص آن سر و کار داریم و نیازی به اشغال حافظه و منابع سیستم در این مورد خاص نیست.
سؤال: چگونه آنرا تعریف کنیم؟اگر از NHibernate سنتی استفاده میکنید (یا به عبارتی فایلهای hbm.xml را دستی تهیه میکنید)، ویژگی Lazy را به صورت زیر میتوان مشخص کرد:
<property name="Text" lazy="true"/>
اگر از Fluent NHibernate استفاده میکنید (و فایلهای hbm.xml به صورت خودکار از کلاسهای شما تهیه خواهند شد)، روش کار به صورت زیر است (فراخوانی متد LazyLoad روی خاصیت مورد نظر):
public class Post
{
public virtual int Id { set; get; }
public virtual string PostText { set; get; }
}
public class PostMappings : ClassMap<Post>
{
public PostMappings()
{
Id(p => p.Id, "PostId").GeneratedBy.Identity();
Map(p => p.PostText).LazyLoad();
//…
Table("Posts");
}
}
در این حالت در پشت صحنه در مورد خاصیت PostText چنین نگاشتی تعریف خواهد شد:
<property name="PostText" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" lazy="true" />
سؤال: چه زمانی نباید از این روش استفاده کرد؟فرض کنید در شرایطی دیگر نیاز است تا اطلاعات تمام رکوردهای جدول مذکور به همراه مقدار PostText نمایش داده شود. در این حالت بسته به تعداد رکوردها، ممکن است هزاران هزار کوئری به دیتابیس ایجاد شود که مطلوب نیست (به ازای هربار دسترسی به خاصیت PostText یک کوئری تولید میشود).
البته امکان لغو موقت این روش تنها در حین استفاده از HQL (یکی دیگر از روشهای دسترسی به دادهها در NHibernate) میسر است. اطلاعات بیشتر:
(+)