Skip to content

1. مقدمه

1.1. Objectif

نسخه PDF سند در |ICI| موجود است.

نمونه‌های موجود در سند در |ICI| در دسترس هستند.

Entity Framework یک ORM (نقشه‌بردار شیء–رابطه‌ای) است که در ابتدا توسط مایکروسافت ایجاد شد و اکنون به صورت متن‌باز در دسترس است. در یک دوره، من از معماری زیر برای یک برنامه وب خاص استفاده می‌کنم:

چارچوب NHibernate [http://sourceforge.net/projects/nhibernate/] یک ORM است که قدمتی پیش از Entity Framework دارد. این یک محصول بالغ است که امکان اتصال به پایگاه‌های داده مختلف را فراهم می‌کند. ORM لایه [DAO] (ابجکت‌های دسترسی به داده) را از کانکتور ADO.NET ایزوله می‌کند. این ORM است که دستورات SQL را به کانکتور صادر می‌کند. لایه [DAO] نیز به نوبه خود از رابط ارائه‌شده توسط ORM استفاده می‌کند. این به نوبه خود به ORM وابسته است. بنابراین، تغییر ORM مستلزم تغییر لایه [DAO] است.

این معماری به‌خوبی با تغییرات در SGBD کنار می‌آید.

وقتی لایه [DAO] مستقیماً به کانکتور ADO.NET متصل است، تغییر SGBD بر لایه [DAO] تأثیر می‌گذارد:

  • تمام لایه‌های SGBD دارای انواع داده‌ای یکسان نیستند؛
  • مقادیر SGBD استراتژی‌های تولید کلید اصلی یکسانی ندارند؛
  • SGBD حاوی SQL اختصاصی هستند؛
  • لایه [DAO] ممکن است از کتابخانه‌هایی استفاده کرده باشد که به یک SGBD خاص لینک شده‌اند؛
  • ...

هنگامی که یک ORM به کانکتور ADO.NET متصل می‌شود، تغییر SGBD معادل تغییر پیکربندی ORM برای تطبیق آن با SGBD جدید است. لایه [DAO] بدون تغییر باقی می‌ماند.

چارچوب Spring.NET [http://www.springframework.net/index.html] یکپارچگی لایه‌های یک برنامه را تضمین می‌کند. در بالا:

  • برنامه کاربردی ASP.NET یک مرجع به لایه [DAO] را از Spring درخواست می‌کند؛
  • اسپرینگ از یک فایل پیکربندی برای ایجاد این لایه و بازگرداندن مرجع آن استفاده می‌کند.

این معماری تا زمانی که لایه‌ها همچنان همان رابط را ارائه دهند، به خوبی با تغییرات آن‌ها کنار می‌آید. تغییر لایه [DAO] در بالا مستلزم اصلاح فایل پیکربندی Spring است تا لایه جدید به جای لایه قدیمی ایجاد شود. از آنجایی که این لایه‌ها یک رابط یکسان را پیاده‌سازی می‌کنند و لایه ASP.NET از این رابط استفاده می‌کند، لایه ASP.NET بدون تغییر باقی می‌ماند.

بنابراین این امر یک معماری انعطاف‌پذیر و مقیاس‌پذیر فراهم می‌کند. برای نشان دادن این موضوع، ما ORM و NHibernate را با Entity Framework 5 جایگزین خواهیم کرد:

ما در چند مرحله پیش خواهیم رفت:

  • ما Entity Framework 5 را با استفاده از چندین فایل SGBD بررسی خواهیم کرد؛
  • ما لایه [DAO2] را خواهیم ساخت؛
  • ما برنامهٔ موجود ASP.NET را به این لایهٔ جدید [DAO] متصل خواهیم کرد.

1.2. ابزارهای مورد استفاده

تست‌ها روی یک لپ‌تاپ HP EliteBook با سیستم‌عامل ویندوز 7 پروفشنال، پردازنده Intel Core i7 و 8 گیگابایت RAM انجام شدند. ما از C# به عنوان زبان توسعه استفاده خواهیم کرد.

این سند از ابزارهای زیر استفاده می‌کند که همگی به‌صورت رایگان در دسترس هستند:

ابزارهای توسعه:

  • Visual Studio Express for Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express for the Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

SGBD SQL Server Express 2012:

  • SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • یک ابزار مدیریت: EMS SQL مدیر برای SQL سرور نرم‌افزار رایگان [http://www.sqlmanager.net/fr/products/mssql/manager/download].

SGBD نسخه اکسپرس پایگاه داده اوراکل ۱۱ g نسخه ۲:

  • SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • یک ابزار مدیریتی: EMS SQL مدیر برای Oracle نرم‌افزار رایگان [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • یک کلاینت Oracle برای .NET: ODAC نسخهٔ ۵ انتشار ۱۱.۲ (11.2.0.3.20) همراه با ابزارهای توسعهٔ Oracle برای Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

SGBD MySQL 5.5.28:

  • SGBD: [http://dev.mysql.com/downloads/];
  • یک ابزار مدیریت: EMS، SQL مدیر برای MySQL، نرم‌افزار رایگان [http://www.sqlmanager.net/fr/products/mysql/manager/download].

SGBD PostgreSQL 9.2.1:

  • SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • یک ابزار مدیریتی: EMS SQL مدیر برای PostgreSQL نرم‌افزار رایگان [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

SGBD فایربرد ۲.۱:

  • SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • یک ابزار اداری: EMS SQL مدیر برای InterBase/Firebird نرم‌افزار رایگان [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: یک ابزار آموزشی برای LINQ (زبان INtegrated پرس‌وجو) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. کدهای منبع

کدهای منبع برای مثال‌های زیر در URL [http://tahe.developpez.com/dotnet/ef5cf] در دسترس هستند.

این‌ها پروژه‌های ویژوال استودیو ۲۰۱۲ ([1]) هستند که در یک راه‌حل ([2]) گروه‌بندی شده‌اند. در پوشه‌ای به نام [databases]، برای هر پروژه SGBD مورد استفاده، یک پوشه وجود دارد. این پوشه‌ها حاوی اسکریپت‌های SQL برای تولید پایگاه داده نمونه برای این پروژه‌های SGBD هستند.

1.4. روش

برای یادگیری Entity Framework 5 Code First، من با کتاب زیر شروع کردم: «Professional ASP.NET MVC 3» نوشتهٔ جان گالووی، فیل هاک، برد ویلسون و اسکات آلن، منتشر شده توسط Wrox. در اپلیکیشن نمونه کتاب، نویسندگان از Entity Framework (EF) به‌عنوان ORM استفاده می‌کنند. از آنجا که با آن آشنا نبودم، برای کسب اطلاعات بیشتر در اینترنت جستجو کردم. متوجه شدم که جدیدترین نسخه، EF 5 است و با EF 4 ناسازگاری‌هایی وجود دارد، زیرا کدهای کتاب هنگام آزمایش با EF 5، خطاهای کامپایل ایجاد می‌کردند.

سپس متوجه شدم که چندین روش برای استفاده از EF وجود دارد:

  • مدل اول: مقالات متعددی در مورد این رویکرد به EF وجود دارد، برای مثال [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. این مقاله به شرح زیر آغاز می‌شود:

خلاصه: در این مقاله، به بررسی Entity Framework 4 جدید که همراه با چارچوب .NET 4 و Visual Studio 2010 ارائه می‌شود، خواهیم پرداخت. من بحث خواهم کرد که چگونه می‌توانید از منظر مدل-محور به استفاده از آن بپردازید، بر این فرض که می‌توانید طراحی پایگاه داده را از روی مدل هدایت کرده و هم پایگاه داده و هم لایه دسترسی به داده‌های خود را به‌صورت اعلان‌محور (declarative) از روی این مدل بسازید. این مدل شامل توصیف داده‌های شما است که به صورت اشیاء و روابط ارائه می‌شود و رویکردی قدرتمند برای کار با ADO.NET فراهم می‌کند و از طریق انتزاع، جداسازی مسئولیت‌ها را بین تعریف مدل و پیاده‌سازی آن ایجاد می‌کند.

یک ORM به‌عنوان پلی میان جداول پایگاه داده و کلاس‌ها عمل می‌کند.

در بالا،

  • در سمت چپ لایه EF5، اشیایی داریم که به عنوان انتیت‌ها شناخته می‌شوند؛
  • در سمت راست لایه EF5، جداول پایگاه داده قرار دارند.

لایه [DAO] با اشیاء تصویری از جداول پایگاه داده کار می‌کند. این اشیاء در یک زمینه پایداری گروه‌بندی شده و به آن‌ها انتیت‌ها (Entity) گفته می‌شود. تغییراتی که بر روی انتیت‌ها اعمال می‌شود، از طریق لایه ORM در جداول پایگاه داده منعکس می‌شود (واردسازی، اصلاح، حذف). علاوه بر این، لایه [DAO] دارای یک زبان پرس‌وجو، LINQ به انتیتا (INtegrated زبان پرس‌وجو) است که به جای جداول، انتیتاها را پرس‌وجو می‌کند. رویکرد مدل اول شامل ساخت انتیتاها با استفاده از یک ابزار گرافیکی است. هر انتها و روابطی که آن را به سایر انتهاها متصل می‌کند، تعریف می‌شوند. پس از انجام این کار، ابزاری برای تولید استفاده می‌شود:

  • کلاس‌های مختلفی که منعکس‌کنندهٔ انتیت‌های ساخته‌شده به‌صورت گرافیکی هستند؛
  • زبان تعریف داده (DDL) که برای ایجاد پایگاه داده استفاده می‌شود.

تمام مثال‌هایی که برای این روش پیدا کردم، از ویژوال استودیو 2010 پروفشنال و قالبی به نام ADO.NET مدل داده انتیت (Entity Data Model) استفاده می‌کردند. من توانستم این قالب را با ویژوال استودیو 2010 پروفشنال آزمایش کنم، اما وقتی به ویژوال استودیو اکسپرس 2012 – که هدف من بود – تغییر دادم، متوجه شدم که این قالب دیگر در دسترس نیست. بنابراین این رویکرد را کنار گذاشتم.

  • ابتدا پایگاه داده: نقطه شروع این روش یک پایگاه داده موجود است. از آنجا، ابزاری به طور خودکار مدل‌های انتیتی برای جداول پایگاه داده ایجاد می‌کند. بار دیگر، نمونه‌هایی که پیدا کردم – مانند [http://msdn.microsoft.com/en-us/data/gg685489.aspx] – از Visual Studio 2010 Professional و مدل داده انتیتی ADO.NET استفاده می‌کردند. بنابراین من این رویکرد را نیز کنار گذاشتم، هرچند روش مورد علاقه من بود. برای مشخص کردن اینکه از کدام انتیت‌ها به عنوان نماینده یک پایگاه داده موجود استفاده شود، شروع کردن با ابزاری که آن‌ها را تولید می‌کند، ساده بود.
  • کد فرست: شما خودتان کلاس‌هایی را که اشیاء را تشکیل می‌دهند، می‌نویسید. این کار به حداقل درک پایه‌ای از نحوه عملکرد EF نیاز دارد. این رویکردی بود که من انتخاب کردم زیرا با ویژوال استودیو اکسپرس ۲۰۱۲ سازگار بود.

پس از تثبیت این موضوع، به شرح زیر عمل کردم:

  • من برای SQL Server Express 2012 کد نوشتم، زیرا این نسخه‌ای است که بیشترین مثال‌ها برای آن موجود است؛
  • پس از عیب‌یابی این کد، آن را به نسخه‌های دیگر SGBD (Firebird، Oracle، MySQL، PostgreSQL) منتقل کردم.

در اینجا، رویکرد متفاوتی را در پیش می‌گیریم. ابتدا تمام کد مربوط به سرور SQL را شرح می‌دهم، سپس توضیح می‌دهم که چگونه به سایر فایل‌های SGBD منتقل شده است. در این انتقال، تنظیمات زیر اعمال شد:

  • پایگاه‌های داده دارای ویژگی‌های اختصاصی هستند. به‌ویژه، من از تریگرها برای تولید خودکار محتوای برخی از ستون‌ها استفاده کرده‌ام. هر SGBD روش خاص خود را برای مدیریت این موضوع دارد؛
  • اشیاء تصویری در جداول ممکن است تغییر کنند، اما این تغییر عمدی است. می‌توانستم اشیاء مناسبی برای همه پایگاه‌های داده انتخاب کنم؛
  • راننده ADO.NET برای SGBD تغییر می‌کند؛
  • رشته اتصال برای SGBD تغییر کرده است.

روند انجام‌شده به شرح زیر است:

  • مطابقت دادن انتیت‌ها با پایگاه داده. پر کردن پایگاه داده؛
  • خروجی گرفتن پایگاه داده با استفاده از پرس‌وجوهای LINQ؛
  • LINQPad، یک ابزار آموزشی برای LINQ؛
  • افزودن، حذف و اصلاح موجودیت‌ها؛
  • مدیریت دسترسی همزمان؛
  • زمینه پایداری در یک تراکنش ذخیره شده است؛
  • ویرایش یک موجوده خارج از زمینه پایداری؛
  • بارگذاری مشتاق و تنبل؛
  • ساخت لایه [DAO
  • ساخت لایه وب ASP.NET.

1.5. مخاطبان هدف

این سند برای مبتدیان تهیه شده است.

این سند یک دوره آموزشی در مورد Entity Framework 5 Code First نیست. برای این منظور، ممکن است بخواهید برای مثال کتاب *Programming Entity Framework: Code First* نوشته جولی لِرمن و رووان میلر را که توسط انتشارات O'Reilly منتشر شده است، بخوانید. هدف این سند جامع بودن نیست، بلکه صرفاً رویکردی را که برای درک این ORM به کار بردم، تشریح می‌کند. من معتقدم این رویکرد ممکن است برای سایر افرادی که با EF5 سروکار دارند، مفید باشد. هدف من محدود به همین دامنه است.

1.6. مقالات مرتبط در developpez.com

کتاب مذکور به‌عنوان مرجع مورد استفاده قرار خواهد گرفت. همچنین مقالاتی در مورد Entity Framework در developpez.com وجود دارد. در اینجا چند نمونه از آن‌ها آورده شده است:

همانطور که در بالا ذکر شد، این سند جامع نیست. خواندن مقالات فهرست شده در بالا برای پر کردن برخی از خلأها ارزشمند خواهد بود. تحقیقات من ممکن است ناقص باشد. از هر نویسنده‌ای که ممکن است از قلم افتاده باشد، عذرخواهی می‌کنم.