Skip to content

1. مقدمة

1.1. Objectif

يتوفر ملف PDF الخاص بالوثيقة |HERE|.

أمثلة المستند متاحة |HERE|.

Entity Framework هو ORM (Object Relational Mapper) تم إنشاؤه في البداية بواسطة Microsoft وهو متاح الآن كمصدر مفتوح [juillet 2012, http://entityframework.codeplex.com/]. في دورة تدريبية ASP.NET أستخدم البنية التالية لتطبيق ويب معين:

إطار العمل 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 من Spring مرجعًا للطبقة [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 يعمل بنظام Windows 7 pro، ومعالج Intel Core i7، وذاكرة وصول عشوائي (RAM) سعة 8 جيجابايت RAM. سنستخدم لغة C# كلغة تطوير.

يستخدم المستند الأدوات التالية المتوفرة جميعها مجانًا:

أدوات التطوير:

  • Visual Studio Express for Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads
  • Visual Studio Express للويب 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 Manager for SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].

SGBD Oracle Database Express Edition 11g الإصدار 2:

  • SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html
  • أداة إدارة: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download
  • عميل Oracle لـ .NET: ODAC 11.2 الإصدار 5 (11.2.0.3.20) مع أدوات Oracle Developer Tools لـ 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 Manager لـ MySQL Freeware [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 Manager for PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

SGBD Firebird 2.1:

  • SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/
  • أداة إدارة: EMS SQL Manager for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: أداة تعليمية لـ LINQ (لغة INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. أكواد المصدر

رموز المصدر للأمثلة التالية متاحة في URL [http://tahe.developpez.com/dotnet/ef5cf].

هذه مشاريع Visual Studio 2012 [1]، مجمعة في حل [2]. في مجلد [databases]، ستجد مجلدًا لكل SGBD مستخدم. ستجد فيه نصوص SQL لإنشاء قاعدة البيانات النموذجية لهذه SGBD.

1.4. الطريقة

لاكتشاف Entity Framework 5 Code First، بدأت أولاً بالكتاب التالي: "Professional ASP.NET MVC 3" لـ Jon Galloway و Phil Haack و Brad Wilson و Scott Allen من دار النشر Wrox. في التطبيق النموذجي لهذا الكتاب، يستخدم المؤلفون Entity Framework (EF) كـ ORM. وبما أنني لم أكن أعرفه، فقد بحثت في الإنترنت لمعرفة المزيد. وهكذا اكتشفت أن أحدث إصدار هو EF 5 وأن هناك عدم توافق مع EF 4 لأن الكود الوارد في الكتاب الذي تم اختباره باستخدام EF 5 أظهر أخطاء في الترجمة.

ثم اكتشفت أن هناك عدة طرق لاستخدام EF:

  • Model First: هناك العديد من المقالات حول هذا النهج في EF، على سبيل المثال [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. تبدأ هذه المقالة بالآتي:

ملخص: في هذه الورقة، سنلقي نظرة على Entity Framework 4 الجديد الذي يأتي مع .NET Framework 4 و Visual Studio 2010. سأناقش كيف يمكنك التعامل مع استخدامه من منظور "النموذج أولاً" على أساس أنه يمكنك توجيه تصميم قاعدة البيانات من نموذج وبناء كل من قاعدة البيانات وطبقة الوصول إلى البيانات بشكل إعلاني من هذا النموذج. يحتوي النموذج على وصف لبياناتك ممثلة ككيانات وعلاقات، مما يوفر نهجًا قويًا للعمل مع ADO.NET، ويخلق فصلًا بين الاهتمامات من خلال تجريد بين تعريف النموذج وتنفيذه.

يعمل ORM كجسر بين جداول قواعد البيانات والفئات.

أعلاه،

  • على يسار الطبقة EF5، توجد كائنات، تسمى كيانات؛
  • على يمين الطبقة EF5، توجد جداول قاعدة البيانات.

تعمل الطبقة [DAO] مع كائنات الصور من جداول قاعدة البيانات. يتم تجميع هذه الكائنات في سياق استمراري وتسمى كيانات (Entity). يتم ترحيل التعديلات التي يتم إجراؤها على الكيانات، بفضل ORM، إلى جداول قاعدة البيانات (إدراج، تعديل، حذف). بالإضافة إلى ذلك، تتوفر في الطبقة [DAO] لغة استعلام LINQ to Entity (Language INtegrated Query) التي تستعلم عن الكيانات وليس عن الجداول. تتمثل طريقة Model First في إنشاء الكيانات باستخدام أداة رسومية. يتم تعريف كل كيان والعلاقات التي تربطه بالكيانات الأخرى. وبمجرد الانتهاء من ذلك، تتيح الأداة إنشاء:

  • الفئات المختلفة التي تعكس الكيانات التي تم إنشاؤها بيانياً؛
  • لغة DDL (لغة تعريف البيانات) التي تسمح بإنشاء قاعدة البيانات.

كانت جميع الأمثلة التي عثرت عليها حول هذه الطريقة تستخدم Visual Studio 2010 Professional ونموذجًا يسمى ADO.NET Entity Data Model. تمكنت من اختبار هذا النموذج باستخدام Visual Studio 2010 Professional، ولكن عندما انتقلت إلى Visual Studio Express 2012 الذي كان هدفي، لاحظت أن هذا النموذج لم يعد متاحًا. لذلك تخلّيت عن هذا النهج.

  • Database First: نقطة انطلاق هذه الطريقة هي قاعدة بيانات موجودة. انطلاقًا من ذلك، تقوم أداة ما تلقائيًا بإنشاء كيانات تمثل الجداول الموجودة في قاعدة البيانات. وهنا أيضًا، تستخدم الأمثلة التي عثرت عليها، مثل [http://msdn.microsoft.com/en-us/data/gg685489.aspxVisual Studio 2010 Professional ونموذج ADO.NET Entity Data Model. لذلك، تخلّيتُ أيضًا عن هذا النهج الذي كان المفضل لديّ. لمعرفة الكيانات التي يجب استخدامها كصور لقاعدة بيانات موجودة، كان من السهل البدء بأداة تقوم بإنشائها.
  • Code First: نكتب بأنفسنا الفئات التي ستشكل الكيانات. لذا، يجب أن يكون لدينا الحد الأدنى من المعرفة حول كيفية عمل EF. هذا هو المسار الذي اتبعته لأنه كان قابلاً للتطبيق مع Visual Studio Express 2012.

وبعد إتقان ذلك، عملت بالطريقة التالية:

  • كتبت كودًا لـ SQL Server Express 2012 لأن هذا الإصدار هو الذي يتوفر له أكبر عدد من الأمثلة؛
  • وبمجرد تصحيح هذا الكود، قمت بنقله إلى الإصدارات الأخرى من SGBD (Firebird، Oracle، MySQL، PostgreSQL).

سنقوم هنا بإجراء مختلف. سأقوم أولاً بوصف جميع الأكواد الخاصة بـ SQL Server ثم سأصف نقلها إلى ملفات SGBD الأخرى. في عملية النقل هذه، يتم إجراء التعديلات التالية:

  • تتميز قواعد البيانات بخصائص خاصة. فقد استخدمت على وجه الخصوص مشغلات (Triggers) لتوليد محتوى بعض الأعمدة تلقائيًا. لكل SGBD طريقتها الخاصة في إدارة ذلك؛
  • قد تتغير كيانات الصور في الجداول، ولكن هذا يكون عن قصد. كان بإمكاني اختيار كيانات تناسب جميع قواعد البيانات؛
  • يتغير برنامج التشغيل ADO.NET الخاص بـ SGBD؛
  • تتغير سلسلة الاتصال بـ SGBD.

الخطوات المتبعة هي كما يلي:

  • ربط الكيانات بقاعدة البيانات. ملء قاعدة البيانات؛
  • تفريغ قاعدة البيانات باستخدام استعلامات LINQ؛
  • LINQPad، أداة تعليمية لـ LINQ؛
  • إضافة الكيانات وحذفها وتعديلها؛
  • إدارة التنافس على الوصول؛
  • سياق الاستمرارية المحفوظ في معاملة؛
  • تعديل كيان خارج سياق الاستمرارية؛
  • التحميل الفوري والتحميل المؤجل؛
  • بناء الطبقة [DAO
  • بناء طبقة الويب ASP.NET.

1.5. الجمهور المستهدف

الجمهور المستهدف هو المبتدئون.

هذا المستند ليس دورة تدريبية حول Entity Framework 5 Code First. لهذا الغرض، يمكن قراءة كتاب "Programming Entity Framework: Code First" لـ Julie Lerman و Rowan Miller الصادر عن دار النشر O'Reilly. لا يهدف هذا المستند بأي حال من الأحوال إلى أن يكون شاملاً، بل يعرض ببساطة النهج الذي استخدمته لفهم هذا ORM. أعتقد أن هذه الطريقة قد تفيد أشخاصًا آخرين يتعاملون مع EF5. ولا يتجاوز هدفي هذا الإطار.

1.6. مقالات ذات صلة بـ developpez.com

سيكون الكتاب المذكور أعلاه بمثابة مرجع. كما توجد مقالات مخصصة لـ Entity Framework حول developpez.com. فيما يلي بعض منها:

كما هو مذكور أعلاه، فإن هذا المستند ليس شاملاً. من المفيد قراءة المقالات المذكورة أعلاه لسد بعض الثغرات. قد تكون أبحاثي غير كاملة. أرجو من المؤلفين الذين نسيت ذكرهم أن يتكرموا بالاعتذار.