یادگیری Castle ActiveRecord با مثال – قسمت اول

Castle ActiveRecord پیاده سازی الگوی ActiveRecord برای پلت فرم دات نت است که در آن هر نمونه از یک کلاس به عنوان یک رکورد در دیتابیس در نظر گرفته می شود که با ساخته شدن یک نمونه از کلاس، یک رکورد در دیتابیس درج می شود و با به روز شدن اطلاعات آن کلاس، رکورد مورد نظر در دیتابیس به روز می شود. متدهای استاتیک درون کلاس ها بر روی کل یا مجموعه ای از رکوردهای دیتابیس عمل می کنند.
Castle ActiveRecord پیاده سازی الگوی ActiveRecord برای پلت فرم دات نت مایکروسافت است که بر روی NHibernate ساخته شده و به عنوان یک لایه دسترسی به داده ها عمل می کند و پیچیدگی های NHibernate را از دید برنامه نویس مخفی نگه می دارد. انجام عمل Mapping در CAR به صورت اضافه کردن خاصیت به کلاس ها انجام می گیرد و شما را از نوشتن فایل های XML برای انجام نگاشت کلاس ها رها می سازد. با استفاده از Castle ActiveRecord دیگر نیازی به یادگیری نحوه نگاشت فایل های XML در NHibernate ندارید و در چند دقیقه می توانید یک لایه دسترسی به داده های کامل و بی نقص را پیاده سازی کنید. اکثر پیچیدگی های NHibernate بوسیله CAR هندل می شوند. در حال حاضر CAR زیر مجموعه ای از قابلیت های نگاشت NHibernate را که توسط اکثر برنامه نویسان و بیشتر سناریوها مورد استفاده قرار می گیرد را پوشش می دهد.

در این مطلب و مطالب آینده، با بررسی یک مثال نحوه استفاده از Castle ActiveRecord به عنوان یک لایه برای دسترسی به داده ها که بر روی NHibernate ساخته شده است را یاد خواهید گرفت. پیش نیاز یادگیری این مطلب آشنایی با مفهوم ORM است. بهتر است قبل از خواندن این نوشته، مطالب زیر را خوانده باشید :

بررسی مدل برنامه مثال

می خواهیم برنامه ای تحت ویندوز برای کتاب فروشی ها بنویسیم که اطلاعات کتاب ها، مشتریان و فروش یک کتاب فروشی کوچک را مدیریت کند. در این برنامه هر کتاب می تواند یک نویسنده و یک ناشر داشته باشد و در دسته بندی های مختلفی قرار بگیرد. کاربر می تواند اطلاعات فروش کتاب ها را به ازای هر مشتری وارد کند. برای درک بهتر مدل برنامه نگاهی به کلاس دیاگرام زیر بیندازید :

MyBookStore Domain Modelبرای شروع، آخرین نسخه کتابخانهCastle ActiveRecord را از اینجا دانلود کنید. ویژوال استادیو را باز کنید و یک سولوشن خالی ایجاد کنید. یک پروژه از نوع Class Library با نام MyBookStore.Model به سولوشن خود اضافه کنید و کتابخانه Castle.ActiveRecord را به ارجاعات این پروژه اضافه نمایید. یک کلاس به نام Category به این پروژه اضافه کنید، فضای نام Castle.ActiveRecord را using کنید و کدهای زیر را در بدنه آن بنویسید (کپی کنید!) :

[ActiveRecord(Table="Categories", Lazy=true)]
    public class Category: ActiveRecordBase<Category>
    {
        [PrimaryKey(Generator=PrimaryKeyType.Native)]
        public virtual long ID { get; set; }

        [Property(NotNull=true, Length=100)]
        public virtual string Title { get; set; }
    }

اصلاً نگران نباشید اگر منظور Attributeهای اضافه شده به کلاس بالا را متوجه نمی شوید. یکی از مزایای CAR نسبت به استفاده مستقیم از NHibernate همین نحوه نگاشت کلاس ها بر اساس Attributeهاست. در این روش دیگر نیازی به نوشتن فایل های XML برای انجام عمل Mapping ندارید و کدهای نوشته شده در کلاس شما از خوانایی بسیار بالایی برخوردار خواهند بود.

حالا کلاس دیگری به نام Customer به پروژه خود اضافه کنید و کدهای زیر را در آن بنویسید (قبلش فضای نام Castle.ActiveRecord را using کنید ) :


[ActiveRecord(Table="Customers", Lazy=true)]
 public class Customer: ActiveRecordBase<Customer>
 {
 [PrimaryKey(PrimaryKeyType.Native)]
 public virtual long ID { get; set; }

 [Property(NotNull=true, Length=250)]
 public virtual string Title { get; set; }

 [Property(Length=50)]
 public virtual string ContactNumber { get; set; }

 [Property(Length=250)]
 public virtual string Email { get; set; }

 [HasMany(typeof(Order), Inverse=true, Lazy=true)]
 public virtual IList<Order> Orders { get; set; }
 }

اگر به کدهای کلاس های بالا دقت کرده باشید نکته هایی را متوجه خواهید شد :

  • با اضافه کردن صفت ActiveRecord مشخص می کنیم که این کلاس قرار است به یک Table در دیتابیس Map شود.
  • با مقدار دهی Table می توانید نام جدولی که قرار است در دیتابیس ساخته شود را تعیین کنید. اگر مقدار دهی نشود به صورت پیش فرض نام کلاس را برای نام Table انتخاب می کند.
  • در هر کلاس یک پراپرتی به نام ID وجود دارد که با صفت PrimaryKey معرفی شده اند. با این کار یک فیلد به نام ID به عنوان کلید اصلی در Table ایجاد می شود و نوع آن Identity خواهد بود (البته در SQL Server)
  • اعضایی که با صفت Property مشخص شده اند، فیلدهای Table را مشخص می کنند. هر کدام از این اعضا به صورت پیش فرض Nullable هستند که می توانید با مقدار دهی NotNull برای هر کدام این پیش فرض را تغییر دهید.
  • برای اعضای String می توانید Length مشخص کنید.

برای ادامه کلاس های زیر را به پروژه تان اضافه کنید. یادتان نرود در هر کدام فضای نام Castle.ActiveRecord را using کنید!

کلاس Author برای نگهداری اطلاعات یک نویسنده :

Author.cs

[ActiveRecord(Table="Authors", Lazy=true)]
 public class Author: ActiveRecordBase<Author>
 {
 [PrimaryKey(Generator=PrimaryKeyType.Native)]
 public virtual long ID { get; set; }

 [Property(NotNull=true, Length=100)]
 public virtual string Title { get; set; }

کلاس Publisher برای نگهداری اطلاعات ناشر یک کتاب : Publisher.cs

[ActiveRecord(Table="Publishers", Lazy=true)]
public class Publisher: ActiveRecordBase<Publisher>
{
[PrimaryKey(Generator=PrimaryKeyType.Native)]
public virtual long ID { get; set; }</p>
<p dir="ltr">[Property(NotNull=true, Length=100)]
public virtual string Title { get; set; }</p>
<p dir="ltr">[Property(Length=400)]
public virtual string Description { get; set; }
}

کلاس Book برای نگهداری اطلاعات یک کتاب : Book.cs

[ActiveRecord(Table="Books", Lazy=true)]
public class Book: ActiveRecordBase&lt;Book&gt;
{
[PrimaryKey(Generator=PrimaryKeyType.Native)]
public virtual long ID { get; set; }</p>
[Property(NotNull=true, Length=250)]
public virtual string Title { get; set; }

[Property(NotNull=true)]
public virtual decimal BuyPrice { get; set; }

[Property(NotNull=true)]
public virtual decimal SalePrice { get; set; }

[BelongsTo(Column="AuthorID", NotNull=true)]
public virtual Author Author { get; set; }

[BelongsTo(Column="PublisherID", NotNull=true)]
public virtual Publisher Publisher { get; set; }

[HasAndBelongsToMany(typeof(Category), Table="BookCategories" ,
 ColumnKey="BookID", ColumnRef="CategoryID")]
public virtual IList Category Categories { get; set; }
}

کلاس های Author و Publisher نکته جدیدی ندارند اما اگر به تعریف کلاس Book توجه کنید Attributeهای جدیدی می بینید. با توجه به مدل برنامه (که تصویر آن در ابتدای مطلب آمده) موجودیت Book با موجودیت های دیگر ارتباط دارد که باید در تعریف این کلاس این ارتباط ها را معرفی کنیم. پراپرتی های Author و Publisher با صفت BelongsTo به همراه NotNull=true مشخص شده اند. این یعنی هر Book باید متعلق به یک Author و یک Publisher مشخص باشد. پراپرتی Categories لیستی از نوع کلاس Category است که در ابتدای مطلب تعریف آن را دیدید. این پراپرتی با صفت HasAndBelongsToMany مشخص شده است که منظور رابطه چند به چند میان کتاب ها و دسته بندی هاست. در این رابطه ColumnKey فیلدی است که آی دی Book و ColumnRef فیلدی است که آی دی یک Category را برای ایجاد رابطه چند به چند ذخیره می کند. در طرف دیگر رابطه (یعنی در کلاس Category) جای ColumnKey و ColumnRef باید عوض شود اما نام Table باید یکی باشد.

تا اینجا رابطه های میان کتاب ها با دیگر موجودیت ها را برای کلاس Book تعریف کردیم. برای اینکه کلاس های دیگر نیز رابطه خودشان با کلاس Book را بدانند باید برای آن ها نوع رابطه را مشخص کنیم. برای این منظور کلاس های فوق را به صورت زیر تغییر دهید:

کلاس Author :

[ActiveRecord(Table="Authors", Lazy=true)]
 public class Author: ActiveRecordBase<Author>
 {
 [PrimaryKey(Generator=PrimaryKeyType.Native)]
 public virtual long ID { get; set; }

 [Property(NotNull=true, Length=100)]
 public virtual string Title { get; set; }

 [HasMany(typeof(Book), Inverse=true, Lazy=true)]
 public virtual IList<Book> Books { get; set; }
 }

کلاس Publisher :

[ActiveRecord(Table="Publishers", Lazy=true)]
 public class Publisher: ActiveRecordBase<Publisher>
 {
 [PrimaryKey(Generator=PrimaryKeyType.Native)]
 public virtual long ID { get; set; }

 [Property(NotNull=true, Length=100)]
 public virtual string Title { get; set; }

 [Property(Length=400)]
 public virtual string Description { get; set; }

 [HasMany(typeof(Book), Inverse=true, Lazy=true)]
 public virtual IList<Book> Books { get; set; }
 }

کلاس Category :

[ActiveRecord(Table="Categories", Lazy=true)]
 public class Category: ActiveRecordBase<Category>
 {
 [PrimaryKey(Generator=PrimaryKeyType.Native)]
 public virtual long ID { get; set; }

 [Property(NotNull=true, Length=100)]
 public virtual string Title { get; set; }

 [HasAndBelongsToMany(typeof(Book), Table="BookCategories", ColumnKey="CategoryID", ColumnRef="BookID")]
 public virtual IList<Book> Books { get; set; }
 }

همانطور که مشاهده می کنید نیازی نیست تمام تعریف کلاس های بالا را تغییر دهید، فقط کافیست پراپرتی های جدید را به همان کلاس های قبلی اضافه کنید. در کلاس های Author و Publisher یک پراپرتی به نام Books از نوع لیستی از کلاس Book با صفت HasMany تعریف شده است. HasMany مشخص کننده یک رابطه یک به چند از این موجودیت ها به موجودیت «کتاب» است. Inverse=true مشخص می کند که طرف دیگر رابطه یعنی Book مسئول ذخیره کردن اطلاعات است و Lazy=true ویژگی Lazy Loading را برای این مجموعه فعال می کند.

پراپرتی جدید کلاس Category مشخص کننده رابطه چند به چند این موجودیت با موجودیت Book است. اگر به تعریف کلاس Book نگاهی دوباره بیندازید مشاهده می کنید که این رابطه برای کلاس Book تعریف شده است. در Castle ActiveRecord همیشه باید رابطه ها را برای هر دو طرف یک رابطه تعریف کنید. برای یک رابطه چند به چند باید از صفت HasAndBelongsToMany استفاده کنید و ColumnKey، ColumnRef و Table را طوری مقدار دهی کنید که در انتها یک رابطه چند به چند به درستی بین دو موجودیت بوسیله یک Table واسط ایجاد شود. ColumnKey همیشه کلید خارجی موجودیت جاری است و ColumnRef کلید خارجی طرف دیگر رابطه را مشخص می کند. نام Table برای هر دو طرف رابطه باید یکی باشد تا CAR بتواند رابطه چند به چند را برای شما ایجاد کند.

farasun.wordpress.com

این مطلب ادامه دارد…

برای اینکه مطالب بعدی را از دست ندهید، مشترک فید فراسان شوید!

چرا NHibernate انتخاب خوبی به عنوان یک ORM است؟

در مطلب قبل دلایلی برای استفاده از ORM در دات نت فریم ورک برای دسترسی به داده ها و کار با دیتابیس معرفی شد. در این مطلب به معرفی NHibernate و دلایلی برای استفاده از آن به عنوان یک ORM مناسب برای دات نت فریم ورک پرداخته خواهد شد. NHibernate پیاده سازی ORM معروف دنیای جاوا یعنی Hibernate برای پلت فرم دات نت است که به صورت گسترده ای مورد استفاده توسعه دهندگان دات نت در سراسر دنیا قرار گرفته است. NHibernate آزاد و کد باز است و وظیفه اش مانند ORMهای دیگر نگاشت کلاس های شیء گرا به جدوال یک دیتابیس است.

nhibernate logoدر ادامه مطلب با مزیت های NHibernate به عنوان یکی از بهترین ORMهای موجود برای پلت فرم دات نت آشنا می شوید. البته تمام مزیت هایی که در مطلب قبل در مورد یک ORM ذکر شد، در مورد NHibernate نیز صحت دارند که دیگر از ذکر آن ها در این مطلب صرف نظر شده است.

کد باز است : شاید به نظر بعضی ها اوپن سورس بودن مزیت محسوب نشود، اما کد باز بودن NHibernate باعث شده تا این پروژه خیلی زود پیشرفت کند و به پر استفاده ترین و به روز ترین ORM پلت فرم دات نت تبدیل شود. در حال حاضر افراد زیادی به صورت تمام وقت و نیمه وقت بر روی توسعه NHibernate کار می کنند و از این ORM در بسیاری از پروژه های کد باز و تجاری استفاده می شود. حداقل برای من، کد باز بودن NHibernate مزیت بسیار مهمی محسوب می شود.

منابع آموزشی زیادی دارد : NHibernate دارای مستندات قوی و جامعه کاربری بزرگی است. یادگیری آن به لطف مستندات کامل و کتاب هایی که در مورد آن نوشته شده، آسان است. کاربران بسیاری در وب سایت های مختلف حاضر به پاسخگویی سئوالات شما در مورد NHibernate خواهند بود و برای تمام مشکلات شما راه حل های بسیاری در سطح اینترنت وجود دارد. با جستجوی کوچکی در اینترنت می توانید کتاب های مناسبی برای یادگیری NHibernate دانلود کنید!

واقعاً از چند دیتابیس پشتیبانی می کند : شما فقط به SQL Server محدود نخواهید بود و تقریباً می توانید از هر دیتابیسی برای ذخیره داده های برنامه خود استفاده کنید.  NHibernate در حال حاضر از DBMSهای معروف و پر کاربرد مثل Oracle, SQL Server و MySql و چند دیتابیس دیگر پشتیبانی واقعی می کند. این در حالی است که Entity Framework مایکروسافت در حال حاضر به صورت رسمی فقط از SQL Server پشتیبانی می کند.

از زبان HQL پشتیبانی می کند : زبان HQL یک زبان پرس و جوی پیشرفته است که در پروژه Hibernate جاوا به صورت وسیع مورد استفاده قرار می گیرد. با استفاده از این زبان می توانید کوئری های پیچیده را بر روی دیتابیس مورد نظر خود اجرا کنید.

امتحان خود را پس داده است : در حال حاضر NHibernate به صورت گسترده ای در پروژه های مختلف کد باز و تجاری مبتنی بر پلت فرم دات نت مایکروسافت مورد استفاده قرار می گیرد. تجربه های بسیار خوبی از استفاده از NHibernate به عنوان ORM در پلت فرم دات نت وجود دارد. در واقع NHibernate مطمئن ترین و با اعتبار ترین ORM برای پلت فرم دات نت مایکروسافت است.

انجام تغییرات را آسان می کند : از آنجا که موجودیت های پروژه را خودتان مدل می کنید و بر روی آن ها کنترل دارید، انجام تغییرات بر روی مدل و ایجاد دیتابیس از روی آن با NHibernate بسیار آسان است. انجام تغییرات بر روی مدل برنامه با مهارت های یک برنامه نویس معمولی دات نت قابل انجام است و نیازی نیست برای تغییر در مدل برنامه و در نتیجه تغییر در دیتابیس یک حرفه ای باشید. این را هنگام توسعه اولین برنامه خود با NHibernate شدیداً درک خواهید کرد!

کتابخانه های کمکی مناسبی دارد : پس از یادگیری NHibernate متوجه خواهید شد که می توان بسیاری از کارها را با کتابخانه های کمکی که برای آن نوشته شده، سریع تر و آسان تر انجام داد. به طور مثال می توان از Fluent NHibernate برای انجام اعمال Mapping به جای نگاشت بر اساس فایل های XML استفاده کرد. کتابخانه  Castle ActiveRecord با اضافه کردن لایه ای بر روی NHibernate کاری می کند که شما بدون درگیر شدن با پیچیدگی های NHibernate از آن به راحتی استفاده کنید. کتابخانه ای برای اضافه کردن Validation و کتابخانه ای برای اجرای کوئری های Linq بر روی آبجکت های NHibernate نیز موجود است.

کارایی بالایی دارد : به عنوان یک ORM از کارایی مناسبی برای انجام عملیات های سنگین بر روی دیتابیس برخوردار است. البته این کارایی مناسب در صورتی است که شما NHibernate را به درستی تنظیم و از آن استفاده کنید. ویژگی هایی مثل Second Level Caching، Multi Query و Batch Select که باعث کاهش ایجاد اتصال ها به دیتابیس و در نتیجه افزایش Performance می شوند در NHibernate وجود دارند و شما کافیست تا از آن ها در مواقع مناسب استفاده کنید.

قابلیت تست پذیری بالایی دارد : به علت جدا کردن دامین مدل برنامه از لایه های دیگر برنامه، قابلیت تست پذیری اپلیکیشن هایی که بر اساس NHibernate توسعه می یابند بسیار بالاست. شما می توانید مدل برنامه خود را مورد آزمایش های واحد قرار دهید و از صحت عملکرد آن ها اطمینان حاصل نمایید.

farasun.wordpress.com

اگر دلیل دیگری برای استفاده از NHibernate به عنوان یک ORM مناسب برای دات نت فریم ورک سراغ دارید، در فرم نظرات این مطلب با ما به اشتراک بگذارید.

10 دلیل برای استفاده از ORM در دات نت فریم ورک

ORM یک تکنیک برنامه نویسی برای تبدیل مدل رابطه ای یک دیتابیس به مدل شیء گرا و بالعکس می باشد که در حال حاضر مورد توجه بسیاری از توسعه دهندگان نرم افزاری قرار دارد. استفاده از ORMها مزایای بسیاری دارد و در بسیاری موارد کار توسعه را آسان تر و لذت بخش تر خواهد کرد. برای دات نت فریم ورک ORMهای کدباز و تجاری زیادی وجود دارد که از این جمله می توان به ADO.NET Entity Framework و NHibernate اشاره نمود. من به شخصه از Entity Framework در یک پروژه واقعی استفاده کردم و تمام مزایایی که قبلاً در مورد یک ORM خوانده بودم را در واقعیت دیدم. در این مطلب به 10 دلیل برای استفاده از یک ORM در یک پروژه مبتنی بر دات نت فریم ورک اشاره خواهم کرد که به شخصه آن ها را تجربه کرده ام.

1- افزایش سرعت توسعه : طراحی لایه دسترسی به داده ها در یک برنامه تجاری معولاً زمان قابل توجهی را به خود اختصاص می دهد و کارهای تکراری مثل درج، به روز رسانی، حذف و خواندن رکوردهای دیتابیس به وفور در آن یافت می شود. استفاده از یک ORM می تواند زمان طراحی لایه دسترسی به داده ها را کاهش دهد یا حتی در مواردی نیاز شما به این لایه را از بین ببرد و شما را از نوشتن کدهای تکراری برای انجام اعمال بر روی دیتابیس راحت کند. اگر وقت زیادی صرف نوشتن کوئری های SQL به صورت رشته ای برای خواندن رکوردها و استفاده از آبجکت های ADO.NET برای درج، به روز رسانی یا حذف داده های یک دیتابیس می کنید، بهتر است در رویه برنامه نویسی خود تجدید نظر کنید و بقیه مزایای استفاده از یک ORM را تا انتها بخوانید!

2- رعایت الگوی طراحی شیء گرا : تفاوت ماهیت دیتابیس های رابطه ای با الگوی شیء گرا همیشه برای برنامه نویسان معضل بزرگی بوده و هست. کار اصلی ORM این است که جدوال رابطه ای یک دیتابیس را به کلاس های شیء گرا و بالعکس تبدیل کند و مدل سازی های مورد نیاز را به صورت استاندارد انجام دهد. هرچند در این روش نمی توان از برخی مفاهیم مهم طراحی شیء گرا مثل ارث بری یا چند ریختی استفاده کرد اما برنامه نویس را مجبور خواهد کرد تا حداقل قوانین های طراحی شیء گرایی را در پروژه خود لحاظ کند. استفاده از الگوی طراحی OOP باعث کاهش پیچیدگی پروژه و آسان تر شدن نگهداری کد و اعمال تغییرات بر روی آن خواهد شد.

3- کاهش پیچیدگی پروژه : شاید در ابتدا استفاده از یک ORM برای طراحی یک پروژه بزرگ ترسناک به نظر برسد! اما در واقع ORM برای کاهش پیچیدگی توسعه یک پروژه بوجود آمده است. استفاده از کلاس های شیء گرا برای کار با ساختار پایگاه داده برای یک برنامه نویس دات نت بسیار راحت تر از سر و کله زدن با کوئری های SQL برای رسیدن به نتایج مورد نظر یا انجام عملیات بر روی دیتابیس خواهد بود. در واقع کدهای مورد استفاده در پروژه ای که با یک ORM توسعه داده شده است به مراتب خواناتر از پروژه های دیگر است و حتی یک فرد غیر برنامه نویس نیز منظور کد را خواهد فهمید.

4- راحت شدن از دست SQL : برای کار کردن با جداول یک پایگاه داده زبان SQL زبان بی نقصی است، اما زمانی که قرار باشد از آن در یک زبان برنامه نویسی شیء گرا مثل سی شارپ استفاده شود، واقعاً عذاب آور خواهد بود. فرض کنید در تمام پروژه خود از دستورات SQL در متغیرهای string استفاده کرده اید، حال با تغییر نام یک فیلد بایستی به دنبال رشته نام فیلد مورد نظر، کل پروژه را بگردید و رشته جدید را جایگزین آن کنید و این کار به صورت خودکار انجام نخواهد شد. کامپایلر هیچ نوع کنترلی بر روی رشته های  SQL ندارد و یک اشتباه تایپی می تواند باعث ایجاد خطای در حال اجرا شود. استفاده از ORM می تواند شما را شر SQL راحت کند!

5- طراحی استاندارد لایه دسترسی به داده ها : در پیاده سازی ORMهای موجود تمام تجربه های موفق لحاظ شده اند و در نتیجه کدهای تولید شده توسط آن ها کاملاً بهینه و استاندارد هستند. ORM باعث می شود تا شما و بقیه اعضای تیم از یک استاندارد خاص برای طراحی لایه دسترسی به داده های خود پیروی کنید و در نتیجه بازدهی بهتری را شاهد باشید. این مزیت در آخر باعث بوجود آمدن یک ساختار مناسب در لایه دسترسی به داده های پروژه شما خواهد شد.

6- امکان استفاده از LINQ : در دات نت فریم ورک می توانید از زبان LINQ برای اجرای کوئری های مختلف در هنگام استفاده از یک ORM بهره ببرید. با این کار کامپایلر کنترل کاملی بر روی کوئری های نوشته شده دارد و تمام خطاها را شناسایی و گزارش خواهد کرد. به علاوه کوئری های نوشته شده در این حالت از خوانایی بسیار بالاتری برخوردار خواهند بود و می توانید از قابلیت های IntelliSense ویژاول استادیو برای بالا بردن سرعت کدنویسی و کاهش خطاهای انسانی بهره ببرید.

7- ORMها آزمایش خود را پس داده اند : در حال حاضر تعداد بسیار زیادی از پروژه های اوپن سورس پلت فرم دات نت بر پایه یک ORM توسعه یافته اند. با یک جستجوی کوچک می توانید لیست بلند بالایی از این پروژه ها را مشاهده کنید. تجربه های خوب بسیار زیادی هم از پروژه های تجاری که از ORM برای دسترسی به داده ها استفاده کرده اند در اینترنت وجود دارد. این نشان می دهد که ORMها آزمایش خود را پس داده اند و برای استفاده در پروژه های واقعی به اندازه کافی قابل اعتمادند.

8- نگهداری از کد و تغییر آن در دراز مدت آسان تر می شود : به علت پشتیبانی ORMها از الگوی طراحی شیء گرا و دیگر الگوهای طراحی در توسعه نرم افزار و تولید کدهای استاندارد، نگهداری از کدهای نوشته شده و تغییر آن ها در طولانی مدت بسیار آسان تر خواهد شد. کدهای نوشته شده بر مبنای یک ORM معمولاً بسیار واضح هستند و تغییر آن ها اگر به صورت استاندارد نوشته شده باشند، اصلاً سخت نخواهد بود.

9- استفاده از قابلیت Refactoring : فرض کنید نیاز دارید تا نام چند فیلد یا جدول را در دیتابیس خود تغییر دهید. اگر از ADO.NET و کدهای SQL برای طراحی لایه داده های خود استفاده کرده باشید، برای انجام این تغییرات در کدهای خود نمی توانید از قابلیت Refactoring ویژوال استادیو استفاده کنید تا به صورت اتوماتیک این کارها انجام شود. اما با استفاده از یک ORM، تغییر دادن یک موجودیت باعث به روز رسانی تمامی ارجاع های آن موجودیت در کل پروژه توسط قابلیت Refactoring ویژوال استادیو خواهد شد. این قابلیت می تواند خطاهای انسانی را فوق العاده کاهش و سرعت توسعه را افزایش دهد.

10 – عدم وابستگی به یک دیتابیس خاص : هر چند این نکته در مورد تمام ORMهای مخصوص دات نت فریم ورک درست نیست، اما در حال حاضر ORMهای خوبی مثل NHibernate و Entity Framework از چندین دیتابیس پر استفاده پشتیبانی می کنند. البته EF در حال حاضر به صورت رسمی فقط از SQL Server پشتیبانی می کند!

farasun.wordpress.com

توصیه می شود مطالبی که قبلاً دوستان در این مورد نوشته بودند را مطالعه کنید :

farasun.wordpress.com

عناوین دیگر برای این نوشته : چرا باید از یک ORM در دات نت فریم ورک استفاده کرد؟ | مزیت های استفاده از ORM در دات نت فریم ورک

راه های دسترسی به داده در دات نت فریم ورک!

در اکثر برنامه های کامپیوتری نیاز به ذخیره و بازیابی داده ها وجود دارد. داده هایی که بدون آن ها سیستم نرم افزاری ما معنایی ندارد. برنامه نویسان معمولاً راه های مختلفی برای این کار سراغ دارند. کسانی که با دات نت فریم ورک برنامه نویسی می کنند راه های مختلفی برای دسترسی به داده ها دارند. در این مطلب با تکنولوژی های مایکروسافت برای این کار آشنا خواهیم شد و سه ORM معروف دنیای دات نت را معرفی خواهیم کرد. مایکروسافت انتخاب های زیادی برای دسترسی به داده ها به برنامه نویسان دات نت می دهد که شما باید با بررسی آن ها و با توجه به نیازهای خودتان یکی از آن ها را انتخاب کنید.

ADO.NET

ADO.NET مجموعه ای از کامپوننت هاست که برنامه نویسان می توانند از آن ها برای برقراری ارتباط با دیتابیس های مختلف استفاده کنند. ADO.NET بخشی از کتابخانه کلاس های پایه دات نت فریم ورک است که توسط مایکروسافت توسعه داده می شود. برنامه نویسان به صورت گسترده از این تکنولوژی برای دسترسی و دستکاری داده های ذخیره شده در یک دیتابیس رابطه ای استفاده می کنند. ADO.NET می تواند با اکثر دیتابیس های موجود کار کند، هر چند به صورت پیش فرض در دات نت فریم ورک فقط فراهم کننده های SQL Server، OleDb و Odbc وجود دارد، افراد و شرکت های دیگر فراهم کننده های دیتابیس های دیگر را برای دات نت ایجاد کرده اند.

برای هر Provider کامپوننت هایی وجود دارند که برنامه نویس با استفاده از آن ها به مقصودش می رسد. به طور مثال برای استفاده از SQL Server در روش ADO.NET کامپوننت هایی مانند SQLConnection و SQLCommand وجود دارد که با استفاده از آن ها می توانید یک دستور SQL را روی داده های موجود در یک دیتابیس SQL Server اجرا کنید. با SQLConnection به دیتابیس موجود در SQL Server وصل می شویم و با استفاده از یک SQLCommand می توانیم یک عبارت T-SQL را که می تواند دستور INSERT, UPDATE, DELETE یا SELECT باشد یا حتی یک Stored Procedure یا عبارت DDL باشد را برای مقصود خاصی روی دیتابیس اجرا کنیم. چون ADO.NET در مورد سینتاکس دیتابیس چیزی نمی داند، دستورات را به صورت یک رشته ساده به SQLCommand می دهیم و این شیء نیز به صورت مستقیم به دیتابیس دستور می دهد.

string query = "SELECT * FROM tblCustomers";
SqlConnection con = new SqlConnection(cnnString);
SqlCommand command = new SqlCommand(query, con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Response.Write(reader.GetInt32(0) +
reader.GetString(1));
}

نکته ای که باید در مورد ADO.NET بدانید این است که برای استفاده از هر سیستم دیتابیس رابطه ای، مجموعه کامپوننت های جدایی وجود دارد. در مثال بالا از آبجکت های مربوط به SQL Server استفاده کردیم. اگر بخواهید مثلاً از یک دیتابیس اوراکل در برنامه خود استفاده کنید، بایستی از کامپوننت های مربوط به اوراکل استفاده کنید. خوشبختانه تمام این کامپوننت ها بر پایه یک Interface ساخته شده اند، این یعنی شما می توانید با استفاده از کلاس DbProviderFactory برنامه ای بسیازید که با چند نوع دیتابیس مختلف کار کند.

Linq to SQL

مایکروسافت با دات نت فریم ورک 3.0 و 3.5 یک ORM به نام Linq to SQL را به عنوان بخشی از پروژه LINQ خود عرضه کرد. این شرکت مدت ها پیش از آن قول داده بود که یک ORM برای دات نت فریم ورک طراحی کند اما تا نسخه 3.0 دات نت فریم ورک خبری از آن پروژه نشد. Linq to SQL به شما اجازه می دهد که کوئری های LINQ را روی دیتابیس های SQL Server اجرا کنید. علاوه بر این از یک Mapping Framework بهره می برد که به برنامه نویسان اجازه Map کردن جدول های یک دیتابیس را به کلاس ها و بالعکس می دهد. این کار در ویژوال استادیو می تواند به صورت ویژوال یا کدنویسی انجام گیرد. به این صورت که برای هر جدول از دیتابیس یک کلاس تعریف می شود که هر ستون از یک جدول به عنوان یک Property درون آن کلاس تعریف می شود.

نمایی از ابزار طراحی ویژوال Linq to SQL

به مثال زیر توجه کنید :
public class Customer
{
[Column(Name="CustomerID",IsPrimaryKey = true)]
public long ID
{
get { return _ID;}
set { _ID = value;}
}
[Column(Name = "CustomerName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
}

کلاس بالا به جدول tblCustomers که دارای دو ستون CustomerID و CustomerName است Map می شود. قبل از اینکه بخواهید از Linq to SQL استفاده کنید باید این کلاس ها را تعریف کنید. ویژوال استادیو 2008 دارای ابزاری است که به صورت ویژوال به شما امکان Map کردن جدول های یک دیتابیس SQL Server را به کلاس های دات نت می دهد. این ابزار می تواند به صورت اتوماتیک کلاس های مورد نیاز شما را از روی مدل دیتابیس بسازد، و حتی اجازه تغییرات دستی و ایجاد Viewهای مختلف از دیتابیس را به شما می دهد. عملیات Mapping با استفاده از DataContext (که یک رشته اتصال به سرور نیاز دارد) پیاده سازی می شود. سپس شما قادر خواهید بود کوئری های LINQ خود را روی دیتابیس موجود در سرور اجرا کنید، که البته این کوئری ها ابتدا به دستوارت T-SQL متناظر ترجمه و سپس روی دیتابیس مورد نظر اجرا می شوند.

Entity Framework

Entity Framework یک فریم ورک ORM برای دات نت فریم ورک است که نسخه یک آن به همراه دات نت فریم ورک 3.5 سرویس پک 1 عرضه شد اما مورد استقبال توسعه دهندگان قرار نگرفت. نسخه 2 این فریم ورک به صورت بتا به عنوان بخشی از ویژوال استادیو 2010 قابل دسترس است. ADO.NET Entity Framework نام اصلی این فریم ورک است و جزئی از تکنولوژی ADO.NET است.

ابزار طراحی Entity Framework در ویژوال استادیو

ابزار طراحی Entity Framework در ویژوال استادیو

Entity Framework مدل رابطه ای موجود در یک دیتابیس را به مدل مفهمومی تبدیل می کند و آن را به اپلیکیشن ما تحویل می دهد. در مدل رابطه ای عناصر ترکیبی از جداول هستند، به همراه کلید های اصلی و خارجی که جدول ها را به هم مرتبط می سازند. برعکس آن، انواع موجودیت ها مدل مفهومی داده را تعریف می کنند. انواع موجودیت  اجتماعی از چند فیلد است (هر فیلد به یک ستون از دیتابیس Map می شود) و می تواند شامل اطلاعات از چند جدول فیزیکی باشد. انواع موجودیت می توانند به هم مرتبط باشند، مستقل از ارتباطاتی که در مدل فیزیکی دارند. شمای منطقی و نگاشت (mapping) آن به شمای فیزیکی به عنوان یک Entity Data Model یا EDM نمایش داده می شوند که مشخصات EDM در یک فایل XML ذخیره می شود. Entity Framework از EDM برای انجام عملیات نگاشت و دادن قابلیت کار با موجودیت ها به اپلیکیشن استفاده می کند. Entity Framework اطلاعات مورد نیاز هر موجودیت را با Join کردن چندین جدول از مدل فیزیکی (دیتابیس) بدست می آورد. هنگامی که اطلاعات یک موجودیت آپدیت می شود، Entity Framework بررسی می کند که داده ها مربوط به کدام یک از جدول های موجود در دیتابیس هستند، سپس آن ها را با دستور SQL مناسب آپدیت می کند.

هر چند Entity Framework و Linq to SQL بسیار شبیه به هم به نظر می رسند، هر دو ابزارهایی برای طراحی گرافیکی و ویزاردی برای نگاشت یک دیتابیس به مدل شیء گرا دارند و هر دو می توانند از کوئری های LINQ برای مقصود خاصی استفاده کنند، اما با هم تفاوت هایی هم دارند. بیان تفاوت های این دو در این مطلب جایی ندارد.

NHibernate

نمی توان در مورد ORMها در دات نت صحبت کرد اما نام NHiernate را ذکر نکرد. NH یک فریم ورک ORM اوپن سورس برای دات نت فریم ورک است که از روی پروژه موفق Hibernate جاوا وارد دنیای دات نت شد. توضیحات بیشتر در مورد NHibernate توضیحات اضافی است، زیرا این فریم ورک هم وظیفه ORMهای دیگر را انجام می دهد. اکثر برنامه نویسانی که از NH برای نگاشت استفاده می کنند، ابتدا کلاس های خود را تعریف می کنند و سپس با استفاده از یک فایل XML آن ها را به جدول های دیتابیس Map می کنند. Linq to SQL و Entity Framework برخلاف NHibernate از روش Model-first یا مبتنی در دیتابیس استفاده می کنند، به این معنی که هر دو ORM تصور می کنند شما دیتابیسی در اختیار دارید که می خواهید آن به تعدادی آبجکت Map کنید.

در مورد Nhibernate بیش از این صحبت نمی کنم، آقای وحید نصیری در اینجا به صورت کامل در مورد این ORM محبوب نوشته است.

farasun.wordpress.com

انتخاب از میان روش های بالا به عهده خود شماست. در این مطلب کوتاه نمی توان به بررسی تمام زوایا و تفاوت های میان آن ها پرداخت. در مطالب آینده سعی میکنم در مورد نحوه استفاده از هر کدام یک مثال عملی بزنم (البته به جز NHibernate).