۱۳۸۹/۱۱/۱۷

اعمال تغييرات سفارشي به ويژگي AutoMapping در Fluent NHibernate


با كمك Fluent NHibernate مي‌توان نگاشت‌ها را به دو صورت خودكار و يا دستي تعريف كرد. در حالت خودكار، روابط بين كلاس‌ها بررسي شده و بدون نياز به تعريف هيچگونه ويژگي (attribute) خاصي بر روي فيلدها، امكان تشخيص خودكار حالت‌هاي كليد خارجي، روابط يك به چند، چند به چند و امثال آن وجود دارد. يا اگر نياز باشد تا اسكريپت توليدي جهت به روز رساني بانك اطلاعاتي، طول خاصي را به فيلدي اعمال كند مي‌توان از ويژگي‌هاي NHibernate validator استفاده كرد؛ مانند تعريف طول و نال نبودن يك فيلد كه علاوه بر بكارگيري اطلاعات آن در حين تعيين اعتبار ورودي دريافتي، بر روي نحوه‌ي به روز رساني بانك اطلاعاتي هم تاثير گذار است:
public class Product
{
public virtual int Id { set; get; }

[Length(120)]
[NotNullNotEmpty]
public virtual string Name { get; set; }

public virtual decimal UnitPrice { get; set; }
}
اين نگاشت خودكار يا AutoMapping ،‌ تقريبا در 90 درصد موارد كافي است. فيلد Id را بر اساس يك سري پيش فرض‌هايي كه اين مورد هم قابل تنظيم است به صورت primary key تعريف مي‌كند، طول فيلدها و نحوه‌ي پذيرفتن نال آن‌ها، از ويژگي‌هاي NHibernate validator گرفته مي‌شود و روابط بين كلاس‌ها به صورت خودكار به روابط يك به چند و مانند آن ترجمه مي‌شود و نيازي نيست تا كلاسي جداگانه را جهت مشخص سازي صريح اين موارد تهيه كرد، يا ويژگي مشخص كننده‌ي ديگري را به فيلدها افزود. اما اگر براي مثال بخواهيم در اين كلاس فيلد Name را به صورت Unique معرفي كنيم چه بايد كرد؟ به عبارتي تمام آنچه‌ كه ويژگي AutoMapping در Fluent NHibernate انجام مي‌دهد، بسيار هم عالي؛ اما فقط مي‌خواهيم مقادير يك فيلد منحصربفرد باشد. براي اين منظور اينترفيس IAutoMappingOverride تدارك ديده شده است:
public class ProductCustomMappings : IAutoMappingOverride<Product>
{
public void Override(AutoMapping<Product> mapping)
{
mapping.Id(u => u.Id).GeneratedBy.Identity(); //ضروري است
mapping.Map(p => p.Name).Unique();
}
}
در حالت استفاده از اينترفيس IAutoMappingOverride مشخص سازي نحوه‌ي توليد primary key ضروري است و سپس براي نمونه، فيلد Name به صورت منحصربفرد تعريف مي‌گردد. در اينجا كل عمليات هنوز از روش AutoMapping پيروي مي‌كند اما فيلد Name علاوه بر اعمال ويژگي‌هاي NHibernate validator، به صورت منحصربفرد نيز معرفي خواهد شد.