یکی از بحث های داغی که تو جلسات بحث و مشورت معماری نرم افزار رایجه صحبت سر انتخاب تکنولوژی دسترسی و مدیریت داده هاست…
گزینه های پیش رو:
» ADO.NET
» Linq 2 SQL یا به اختصار L2S
» و فرزند جدید و حاصل مدت ها تحقیق و تلاش و بهبود مایکروسافت: Entity Framework به اختصار EF
NET Framework 4.0. بلوغ EF به شمار میاد، و عملا مایکروسافت بسیار محترمانه درخواست کرده که جناب برنامه نویس ایرانی که هر 20 سال یه بار یه روش جدید رو تجربه میکنی… خواهشا سنت شکنی بفرمایید و این محصول رو یه تست بزنید بلکه به نظر ملوکانه تون بد نیومد… تو این پست سعی دارم تا این 3 تکنولوژی رو کمی مقایسه کنم البته قصد ندارم معرفی کنم بلکه هدف مقایسه است… خواهیم دید EF نسبت به SubSonics که خود من بهش خیلی ارادت دارم من حیث معماری
مقدمه { Microsoft Entity Framework چیست ؟؟} :
ADO.NET Entity Framework به گونه ای طراحی شده است تا توسعه دهندگان را قادر سازد در مقابل مدل های مرسوم مفهومی (conceptual)، از یک مدل جدید با امکان دسترسی و برنامه نویسی مستقیم بر اساس ساختار یک دیتابیس رایطه ای استفاده نمایند، هدف از تولید این مدل کاهش چشمگیر میزان کدنویسی، سهولت گسترش، ترمیم، بهبود و نگهداری برنامه ها بوده است. به طور خلاصه میتوان از مزایای آن به موارد زیر اشاره کرد:
» برنامه های کاربردی قادر خواهند بود تا در مدل مفهومی خود (conceptual model) محوریت بیشتری به خود برنامه ببخشند به گونه ای که شیء گرایی، ارث بری، گونه ها (Type) های پیچیده تر و روابط بین جداول و اشیاء بهتر پیاده سازی شوند.
» برنامه ها (برنامه نویس ها) از هارد کدینگ (کدنویسی زیادی ابلهانه و طاقت فرسا) رها می شوند.
» بدون کوچک ترین تغییر کد برنامه خواهیم توانست مدل ارتباط بین ساختار دیتابیس و مدل مفهومی را تغییر دهیم.
» توسعه دهندگان (برنامه نویس ها ! :D ) قادرند تا با ساختار شیء گرایانه سازگار با انواع سیستم های مدیریت دیتا کار کنند.
» مرتبط شدن چندین مدل مفهومی به یک ساختا دیتابیس.
» پشتیبانی Language-integrated query (LINQ) موجب اعتبارسنجی عبارات پرس جو (Query) در حین کامپایل میشود.
انتخاب بین L2S و EF
خیلی خلاصه طبقه بندی کردم:
|
چه موقع از Linq to SQL استفاده خواهیم کرد؟ وقتی میخواهیم:
|
| از یک ORM استفاده کنیم و دیتابیس ما در یک رابطه 1 به 1 با مدل اشیاء قرار دارد.
|
| از یک ORM که ساختار سلسله مرتبی ای را که در یک جدول ذخیره شده است ارث بری کرده باشد.
|
| استفاده از کلاس هایی که خودمون نوشتیم در کنار کلاس های تولید شده توسط سیستم یا ارث بری از کلاس های پایه یا پیاده سازی اینترفیس ها در کلاس ها.
|
| استفاده از LINQ به عنوان ابزار Query نویسی
|
| استفاده از یک ORM با حفظ کارآیی و امکان بهبود آن از طریق Stored Procedure ها و Query های کامپایل شده.
|
|
چه موقع از LINQ to Entity استفاده خواهیم کرد؟ وقتی میخواهیم:
|
| وقتی میخواهیم برنامه ما به دیتابیس های دیگری به جز Microsoft SQL Server نیز دسترسی پیدا کند.
|
| وقتی میخواهیم domain models برای برنامه مان تعریف کنیم و از آن به عنوان لایه persistence استفاده نماییم.
|
| استفاده از کلاس هایی که خودمون نوشتیم در کنار کلاس های تولید شده توسط سیستم یا ارث بری از کلاس های پایه یا پیاده سازی اینترفیس ها در کلاس ها.
|
| از یک راهکار ORM ی استفاده کنیم که ممکن است کلاس هایمان رابطه ای 1:1 با دیتابیس داشته باشد یا ممکن است ساختاری بسیار متفاوت و پیچیده در ارتباط با دیتابیس دارا باشد.
|
| می خواهیم از یک ORM استفاده کنیم که ساختارهای سلسله مرتبی در آن معادل های دیتابیسی متفاوتی دارا باشد مانند وقتی که جدولی جهت نگهداری سلسله مراتب، جداولی برای هر یک از کلاس ها و جدولی جهت نگهداری گونه (Type) خاص داریم. |
| وفتی میخواهیم از LINQ جهت نوشت Query ها استفاده کنیم در حالیکه Query در دیتابیس به شیوه خاص و در سلطه سازنده آن عمل می کند . |
| استفاده از یک ORM با حفظ کارآیی و امکان بهبود آن از طریق Stored Procedure ها و Query های کامپایل شده.
|
چرا از Entity Framework استفاده کنیم؟
» دسترسی به داده ها را ساده می سازد و به من اجازه می دهد تا مدل مفهومی مورد نیاز برای کسب و کارم را ایجاد کنم.
» EF اجازه می دهد تا شما روابط چند به چند (n:n) را بدون join ها متعدد مدیریت نمایید.
» جهت کاهش پیچیدگی کد جداول مرتبط را در یک Entity مدل کنید.
» پشتیبانی قئی و خفن از ارث بری ها برای جدول به ازای سلسله مراتب، زیرکلاس (subclass) و تایپ های به هم چسبیده (concrete type).
» Consolidation برای اشیاء پیچیده بسیار ساده است.
» چون دارای مکانیسم بسیار قوی Query گیری از Entity هاست. کسانی که مایل با استفاده از LINQ نیستند می توانند از EntityClient provider همرا با EntitySQL استفاده نمایند.
» میتوانید با استفاده از ADO.NET Data Services (Astoria). دیتای مدل شده خودتان را انتشار دهید.
» مستقل از نوع دیتابیس می باشد و بر اساس استاندارد ADO.NET Providers. کار می کند.
» هم اکنون تعداد زیادی شرکت های دیگر provider هایی ارائه و پیشنهاد کرده اند مانند:
* Devart جهت استفاده ازOracle, MySQL و PostgreSQL EF توصیه می شود.
* Phoenix Software Solutionجهت استفاده از SQLite EF را توصیه می کند.
* Npgsql برای استفاده از PostgreSQL provider دیگری را توصیه کرده.
* OpenLink Software طیف وسیعی را جهت استفاده از for Oracle (versions 7.x to 11.x), Microsoft SQL Server (6.x to 2005), IBM DB2 , Sybase (4.2 to 12.x+), IBM Informix (5.x to 11.x), Ingres (6.4 to 9.x), Progress (7.x to 10.x), MySQL, PostgreSQL, و Firebird پیشنهاد کرده است.
* Sybase SQL Anywhere از SQL Anywhere پشتیبانی می نماید.
* IBM پشتیبانی دیتابیس هایی مانند DB2, Informix و U2 را خودش عهده گرفته است.
» بخش های دیگر زیادی به آن افزوده خواهد شد...
نتایج یک مقایسه بین Entity Framework و Subsonic
با اینکه Subsonic رو به لحاظ معماری خیلی قبول دارم ولی یه مقایسه ساده رو میزارم تا ببینید چقدر به لحاظ کارآیی Entity Framework سره:
تست ساده ایه که میتونم سورسش رو بزارم برای دانلود، ملاک اینجا زمان مورد نیاز جهت لود کردن مقادیر مختلفی از اطلاعاته:
| Subsonic | Entity Framework |
| 3937 | 1312 |
| 1906 | 140 |
| 1062 | 156 |
| 1078 | 140 |
| 1062 | 140 |
| مقادیر به میلی ثانیه است | |
میبینید که Entity Framework نتیجه بسیار بهتری داره…
امیدوارم معمارهای نرم افزار و برنامه نویس های ایرانی هم همگام شن تا بتونیم این فضاحت کنونی عرصه کیفیت نرم افزارهای تولید داخل رو بهبود بدیم 