آیا دیتابیس مورد استفاده در NHibernate با نگاشت‌های تعریف شده همخوانی دارد؟
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه


زمانیکه خاصیتی به یکی از کلاس‌های نگاشت‌های تعریف شده اضافه می‌شود یا حذف می‌گردد، دقیقا باید این به روز رسانی در سمت بانک اطلاعاتی هم انجام شود. امکان تهیه و همچنین اعمال اسکریپت نهایی تولید database schema مهیا است، اما ممکن است به هر علتی این کار فراموش شود. اکنون سؤال این است که آیا می‌توان سریع بررسی کرد که دیتابیس مورد استفاده با نگاشت‌های برنامه همخوانی و تطابق دارد؟
جهت پاسخ به این سؤال بهترین راه ایجاد یک کوئری Select بر اساس تمام خواص تعریف شده در یک کلاس است. اگر یکی از خواص یا حتی خود جدول وجود نداشته باشد، انجام این کوئری خودبخود با شکست مواجه شده و یک استثناء صادر خواهد شد. همین ایده را به سادگی می‌توان با NHibernate هم پیاده سازی کرد:
public class ConfirmDatabaseMatchesMappings
{
public static void ValidateDatabaseSchemaAgainstMappings()
{
//در اینجا باید سشن فکتوری سراسری تعریف شده را دریافت و استفاده کرد
using (var session = sessionManager.OpenSession())
{
var allClassMetadata = session.SessionFactory.GetAllClassMetadata();

foreach (var entry in allClassMetadata)
{
session.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
.SetMaxResults(0).List();
}
}
}
}
برای مثال اگر فیلدی در کلاس‌های برنامه موجود باشد اما در بانک اطلاعاتی خیر، استثنای حاصل شبیه به عبارات ذیل خواهد بود:
NHibernate.Exceptions.GenericADOException was unhandled
Message=could not execute query
...
و اگر کمی سایر اطلاعات این استثناء را بررسی کنیم، به همان عبارات آشنای فلان فیلد یافت نشد یا فلان جدول وجود ندارد، ‌می‌رسیم.

  • #
    ‫۱۳ سال و ۹ ماه قبل، پنجشنبه ۱۶ دی ۱۳۸۹، ساعت ۱۳:۲۲
    سلام اقای نصیری
    قبلا داخل وبلاگ شما یا دیگران دقیق یادم نیست با کلاس
    SchemaValidator آشنا شدم این کلاس برای چک کردن وجود دیتابیس برای nhibernate بود
    میخواستم ببینم از همین کلاس می تونه جایگزین همین کد شما در این پست باشه یا فقط برای چک کردن وجود بانک بکار میره و آیا این کد الان شما فقط برای چک تغییرات است یا برای چک کردن خود بانک هم می تونه بکار بره
    با تشکر
  • #
    ‫۱۳ سال و ۹ ماه قبل، پنجشنبه ۱۶ دی ۱۳۸۹، ساعت ۱۴:۰۴
    بله، این کد برای چک کردن خود بانک است. آیا فیلدی فراموش نشده. آیا جدولی از قلم نیفتاده.
    موردی هم که اشاره کردید جزو ابزارهای NHibernate است و شبیه به همین کار را انجام می‌دهد : (+)
  • #
    ‫۱۳ سال و ۹ ماه قبل، جمعه ۱۷ دی ۱۳۸۹، ساعت ۰۱:۴۸
    همچین چیزی واسه EF سراغ دارین؟
  • #
    ‫۱۳ سال و ۹ ماه قبل، جمعه ۱۷ دی ۱۳۸۹، ساعت ۰۲:۳۰
    به صورت توکار و آماده، خیر اما یک ابزار غیر رایگان برای اینکار هست: (+)
    و همچنین یک مورد هم اینجا ذکر شده: (+)