۱۳۸۹/۱۰/۱۵

آيا ديتابيس مورد استفاده در 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
...
و اگر كمي ساير اطلاعات اين استثناء را بررسي كنيم، به همان عبارات آشناي فلان فيلد يافت نشد يا فلان جدول وجود ندارد، ‌مي‌رسيم.