الرئيسية > برمجة قواعد البيانات ADO.NET, تقنية net. > هل تعلم ما هو اطار عمل كيان البيانات Entity Framework ؟

هل تعلم ما هو اطار عمل كيان البيانات Entity Framework ؟

في إحدى الرسائل التي وصلتني إلى بريدي من فترة ، رسالة من احد الإخوة يقول فيها : " السلام عليكم أبو تقنيات جديدة ! " ضحكت كثيرا عندما قرأتها ، فقد كانت مضحكه جدا ، ودفعني إلى مراجعة مقالاتي ومدوناتي التي كتبتها، فوجدت ان اغلبها يتحدث عن التقنيات الجديدة التي تظهر بين الفينة والاخرى ! فأجبته قائلا : نعم اذا كنا سنعتمد على تقنيات من انتاج شركة مايكروسوفت ، فاعلم انه يتوجب علينا اللهث وراء تلك التقنيات لأنها تظهر بشكل أسي بالمعادة F(x) = e^x ههههه .

عموما ، نتحدث اليوم عن تقنية اخرى – كالعادة – ،وهي موجهه للتعامل مع قواعد البيانات ، فإذا كنت من مغرمي برمجة قواعد البيانات فانصحك بمتابعة هذه المقالة والتعرف على الـ Entity Framewrok .

يعد اطار العمل Entity Framework احدى الطرق المضمنه في تقنية ADO.NET للتعامل مع البيانات في الوضع المنفصل ، فهذه التقنية هي أخت للـ Dataset ، فقد ولت تلك الايام التي نستخدم فيها الـ Dataset حكراً رغما عنا ، فقد اصبح باليد الاختيار بين عدة تقنيات : Dataset,Entity Framework,LINQtoSQL… وغيرها من التقنيات التي تظهر يوما بعد يوم . ومن منطلق ان نعرف ما حولنا ومالنا وما علينا ، يتوجب علينا التعرف على هذه التقنية .

تقنية الـ Entity Framework تقوم بتغليف جداول قاعدة البيانات بفئات تتضمن طرق وخصائص تمثل كائنات قاعدة البيانات ، بمعنى لو كان لديك جدول بالإسم Persons وبه حقول كـ PersonID,FirstName,LastName,…etc فإن هذه التقنية ستقوم بتوليد فئة Class بالإسم Persons به حقول بنفس اسم حقول الجدول Persons في قاعدة البيانات ، بإختصار ، تقوم هذه التقنية بإنشاء نموذج Model لكائنات قاعدة البيانات ، موفرة عليك بذلك الكثير من الجهد خصوصا عندما نتكلم عن تطبيقات متعددة الطبقات N-Tier Applications .

من ميزات هذه التقنية ، هو ان نموذج البيانات Data Model الموجود لديك ، لا يشترط ان يكون مطابقاَ لما هو موجود في قاعدة البيانات ، بمعنى اخر ، بإمكانك تخصيص شكل نموذج البيانات ليكون مختلفا عما هو في قاعدة البيانات ، يتحدد هذا على الطريقة التي استخدمتها في تخطيط قاعدة بياناتك وتوزيع الجداول والحقول فيها ، ستتضح الصورة من هذا لاحقا إن شاء الله .

وبالنسبة للعلاقات بين الجداول ، فهناك ما يدعى بالـ NavigationProperties ، وهي تمثيل للجدول المرتبط بالجدول الحالي ، فلو كان لدينا جدول اب به حقل مرتبط بالجدول الابن ، فإن الحقل الموجود في الجدول الاب لن يظهر بل سيظهر بدل عنه مباشرة خاصية ابحار NavigationProperty للوصول إلى البيانات المرتبطه ، هذا الامر سيتضح اكثر باخذ مثال فلا تقلق نفسك كثيرا .

ميزة اخرى في هذه التقنية ، لو أنك قد استخدمت LINQtoSQL لكنت قد اعجبت بالـ O/R Designer وكيف يحول الجداول والـ Stored Procedures الخاصة بقاعدة بيانات من نوع SQL Server مباشرة إلى كائنات برمجية : فئات وطرق Classes,Methods … الخ ويصبح بإمكانك استخدام LINQ مباشرة في الاستعلام عن البيانات وتعديلها واضافتها وحذفها ،، فإنني متأكد من اغرامك بها ولحسن الحظ فيوجد لدينا ايضا ما يدعى بالـ ADO.NET Entity Model ليحاكي الجداول ويقوم بتوليد كل شيء نيابه عنك .

تطبيق عملي على هذه التقنية :

قم بإنشاء مشروع جديد ، اضف إليه عنصرا جديدا من النوع ADO.NET entity Data Model وسمه بالإسم NorthwindEntityModel مثلا ، سيظهر لك معالج اول صفحاته تسألك عن طريقة انشاء الـكيان Entity هل هي من قاعدة بيانات Generate From Database ام نموذج فارغ Empty Model . الاول يكون افضل في حالة كونك ترغب في عمل نموذج مطابق لقاعدة البيانات ، اما الخيار الآخر ، فهو يترك لك حرية تصميم الـ Conceptual Model بنفسك ثم تربطة بقاعدة البيانات وذلك عندما ترغب في تصممي نموذج هيكل بناؤه مختلف عن قاعدة البيانات .

في حالتنا نختار الخيار الاول ، ثم نتوجه إلى الخطوة التالية وهي تحديد قاعدة البيانات المصدر ، وقد تتفاجأ هنا ايضا بأن نوع قاعدة البيانات المصرح بها هو SQL Server فقط حتى هذا الوقت – على الاقل لدي – على أمل ان يدعم هذا المعالج قواعد البيانات الاخرى كالـ Dataset تماما . ساختار هنا قاعدة البيانات Northwind .

الخطوة التالية هي تحديد عناصر قاعدة البيانات التي تود تمثيلها ، فستجد كل الجداول Tables ، استعلامات العرض Views ، الاجراءات المخزنة Stored Procedures . في حالتنا ، نختار الجداول Products,Orders,OrderDetails ثم ننهي المعالج .

الآن ستظهر لك نافذة مصمم كيان البيانات Data entity Designer تمثيل للجداول التي حددناها سابقا . الآن قم بالتمعن في تلك الكائنات ، ستجد اولا ان العلاقات بين الجداول – عفواً اقصد الفئات ! – موضح بشكل جميل جدا ، وكذلك نوع هذه العلاقة ( واحد لواحد One to One ، واحد لمتعدد One to Many ، الخ ) كما بالشكل التالي :

المخطط الذي أمامك يتكون من مجموعة كتل بيانات entities ، الجزء السفلي من كل entity يحتوي على الـ Navigation Properties "خصائص التنقل " تساعدنا على التعامل مع الفئات المرتبطة بعلاقات Relation فيما بينها – تمثيل لعلاقات قاعدة البيانات .

النافذة Model Browser تساعدك على تصفح وجهي العملة : النموذج Model ومخزن البيانات – قاعدة البيانات .

الان نغلق هذه النافذة ونتوجه إلى النافذة form1 – او كما سميتها لدي MainForm ، وضع بها اداة DataGridView حتى نختبر بعض العمليات في عرض البيانات عليها ، في محرر الاكواد تحديد الحدث Form_Load اكتب كودا مثل :

        Dim Bill As New Entities

        Me.DataGridView1.DataSource = Bill.Orders

الفئة Entities هي التي تحضن كل الفئات الاخرى المولدة من ال NorthwindEntityModel ويمكن تغيير اسمها من الخلال الخاصية EntityContainerName في الـ Entity Designer.

الآن الباب مفتوح أمامك للقيام بالكثير من الأمور ، نبدأ اولا بإظهار بيانات محددة في الـ DataGrid كما يلي :

        Dim Bill As New Entities

        Dim SpecialOrders = From x In Bill.Orders _
                           
Where x.OrderID > 11000 _
                           
Select x.OrderID, x.OrderDate, x.ShipCity

        Me.DataGridView1.DataSource = SpecialOrders.ToList

حيث قمنا بعمل استعلام LINQ بالاسم SpecialOrders حددنا فيه معيار ان يكون الحقل OrderID اكبر من 11000 وقمنا فيه بتحديد عرض الحقول OrderID,OrderDate,ShipCity .

الآن يجب ان نفهم اكثر بناء الفئات ، جرب استكشفات اعضاء الكائن Bill في الكود السابق ، ستجد ان هناك فئات تمثل الجداول المختلفة فضلا عن طرق مثل الطريقة AddToXXX والتي قد تكون AddToOrders والجداول الاخرى ،تسهل علينا اضافة كائن جديد إلى الفئة Orders وبالتالي الجدول Orders ! بهذه الطريقة تختصر كتابة عشرات الاسطر لتمثيل الجداول إلى كائنات ووضعها في فئات Classes وكتابة طرق مختلفة للإضافة والتعديل والحذف … الخ ! ارتك لك استكشاف باقي الاعضاء بنفسك .

من الامور التي احبها في الـ Entity هي انها قابلة لاستعراض البيانات بالربط Binding وذلك كما يلي :

اذهب إلى القائمة Data واختر منها Add New Data Source ، من اول صفحة تظهر لك تختار مصدر البيانات ليكون Object بدلا من Database .

في الصفحة التالية تظهر لك الفئات الفرعية Orders,Products لتصبح قادرا على اضافتها لتكون Datasource في مشروعك ! نفترض اضافة الفئة Products .

ستجد في النافذة Datasources انه قد تم اضافة تلك الفئة واي فئة مرتبطة ( أي علاقة بين الجداول المعنية ) كما بالشكل التالي :

الآن جرب ان تذهب إلى مصمم النافذة MainForm وقم بسحب الفئة Products إلى النافذة MainForm ، ستحتاج بعدها فقط إلى اضافة سطر واحد كهذا :

        Me.ProductsBindingSource.DataSource = Bill.Products

شغل برنامجك لتجد ان البيانات ظهرت كما يجب .

يمكنك الاستعلام في تلك البيانات بالطريقة التالية :

        Dim Bill As New Entities

        Dim SpecialProducts = From myOrder In Bill.Products _
                             
Where myOrder.CategoryID > 6 _
                             
Select myOrder

        Me.ProductsBindingSource.DataSource = SpecialProducts

ويتضح لنا سهوله الاستعلام في البيانات بإستخدام LINQ مباشرة .

من ميزات اطار كتل البيانات Entity Framework ، هو انك تستطيع التحكم بكمية البيانات المنقولة بسهولة ، فعندما نحتاج إلى تعديل على جدول واحد فقط دون الجداول الفرعية المرتبطة به فإننا نستدعي الجدول الأساسي فقط ، لتوضيح هذا سأسرد مثالا سريعا :

الجدول Products مرتبط بالجدول Orders ، فيوجد بينهما علاقة واحد لمتعدد One-to-Many فلو قمنا بإسناد الجدول Products مثلا إلى كائن BindingSource ليكون هو مصدر البيانات DataSource فيه ، فنحن مخيرون هل نضيف الجدول Orders ايضا ام لا ، فإذا كنا نحتاجه سنكتب اسم الجدول Products متبوعا بالطريقة Include ونعطيها اسم الجدول Orders ليتم تحميل بيانات الجدولين معا ، هذه الطريقة مهمة جدا في تخفيف الضغط على مزودات البيانات والشبكة التي يعمل عليها التطبيق ، فبدل ان تقوم بتحميل البيانات وانت لا تحتاج اليها اساسا ، يمكنك ان تقوم بتحميل البيانات التي تحتاج اليها فقط وتقلل بالتالي من الاعباء المحتملة على مزود البيانات Data Server في الشبكة Network .

بهذا نكون قد انتهينا من الحديث بشكل مختصر اتمنى انني قد وفقت في عرضه عليكم ، بإنتظار تعليقاتكم على مدونتي .

  1. يوليو 23, 2009 الساعة 2:20 م

    السلام عليكم
    هه حقا ابو التقنيات
    بارك الله فيك اخي و زادك الله علما

  2. أغسطس 25, 2009 الساعة 6:12 ص

    السلام عليكم

    رائع جداً اخى النبهانى
    سمعت عنها لكن لم التفت لها الا من خلال مقالتك تلك.

    شكرا بارك الله فيك

  3. Wael Dalloul
    أغسطس 25, 2009 الساعة 12:24 م

    بارك الله بك على هذه المقدمة الجميلة, ولكن بالنسبة لي لن استخدمها في برامجي حتى تدعم مزودات قواعد البيانات الاخرى, و ايضا حتى يتم تلافي البطئ الواضح عند التعامل مع البيانات, حيث قمت بتجربتها على حاسبي حيث كانت سرعة جلب البيانات باستخدام الطريقة الاعتيادية (adapter + datatable) اسرع بما يقارب الضعف من استخدام Entity Framework.

  4. احمد صوالحة
    نوفمبر 23, 2009 الساعة 1:58 م

    شكرا على هذا المقال
    لكننا ما زلنا بحاجة إلى المزيد حول الموضوع

  5. نوفمبر 29, 2009 الساعة 7:43 م

    اهلا بالاستاذ وائل Wael Dalloul ، في الحقيقة ما يعيب هذه التقنية هو البطء ، ولكنها قد تحل في الاصدار القادم بإذن الله .

    الاخ احمد صوالحة، سأقوم بطرح سلسلة مقولة ومعمقة من المقالات وبدأتها من امس .

  6. يونيو 1, 2010 الساعة 5:22 م

    nice work mr nabahany
    i have a small question
    do you which one will perform faster
    the Entity framework or codesmith
    also if you know any differences please tell us

    i’m not asking about what code smith could do .. I’ve been working with the codesmith from a while and i like the entity frame work .. but before i go live with the Entity frame work i want to know whats new and i cant find in code smith
    thanks

  7. يونيو 8, 2010 الساعة 11:25 م

    Mr a.mubarak
    i haven’t used codesmith before, but you can still look at the follwoing link :
    http://www.develop.com/entityframework4
    http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/

  8. HAITHAM
    أكتوبر 14, 2012 الساعة 1:28 م

    يسلموووووووووووو يا أبو التقنيات بس ممكن توضحلنا الفرق بين هذه التقنية وتقنية LINQ TO SQL بمثال مع أهم الفروق وشكرا و

  9. Bassam
    يوليو 18, 2016 الساعة 11:01 ص

    شرح وافي ومفيد جدا لتعليم Entiy Framework

  1. نوفمبر 28, 2009 الساعة 9:02 م

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: