JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

-->
الصفحة الرئيسية

عمل Migration عن طريق Database Initializer

 

السلام عليكم ورحمة الله وبركاته

تحدثنا فى هذا الدرس البداية مع Entity Framework Code First بالصور عن الأتصال بقاعدة البيانات عن طريق Wizard.


الطريقة هذه تعمل مع Asp.Net MVC ايضا وستتعامل مع مجلد Models بدلا من EntitiesModel


سنشرح الان الـ Classes الناتجة عن هذه العملية لأن فهمها مهم جدا للتعامل مع Migrations


انشى قاعدة بيانات بإسم MigrationsDb و جدول واحد TblProducts بها 3حقول{Id ProductName  & ProductPrice }

ثم انشئ مشروع جديد وقم بنفس الخطوات السابقة للدرس السابق مع تغير إسم Add.Net Entity Data Model إلى MigrationsEntities .. والغرض من إنشائها بالـ Wizard هو فقط لفهم الـ Classes كما ذكرنا وسوف نتعلم انشاء الجداول والعلاقات وقاعدة البيانات بالكود وبأكثر من طريقة .


افتح مجلد MigrationsEntities ستجد بها 2 Class نقوم بفتح TblProducts


نجد هنا 3 سطور من الاكواد تسمى Property ..لا تهتم كيف كتبت هذه الاكواد سوف نشرحها بالتفصيل

لكن كل سطر كما هو واضح هو لحقل فى قاعدة البيانات وإسم الـ Class هو نفسه إسمالجدول .


نفتح الـ Class الاخر MigrationsEntities وهو نفس الاسم المكتوب فى Add.Net Entity Data Model

سنجد به نفس إسم الـ Class لكنه هنا يشير نص الاتصال بقاعدة البيانات connectionStrings الموجود بملف App.config أو Web.config حسب المشروع


ايضا إسم الجدول موجود كـ Property .. لا تشغل بالك سوف تعرف كتابة كل شيئ بالتفصيل

إلى هنا لم نقدم جديد سوى فهم القليل من عملية انتاج Classes عن طريق Wizard وبعض وظائفها ..

 

لإتمام عملية ال Migrations يجب توافر 3 اشياء :-

الـ Classes الخاصة بالجداول مثل الموجود معنا هنا TblProducts.cs

الـ Class الذى يحتوى على اسماء الجداول كـ property و ربط الاتصال MigrationsEntities.cs

الـ connectionStrings الموجود بملف App.config أو Web.configعملية الـ Migrations نفسها و سنستخدم فى هذا الدرس طريقة Database Initializer
 

أنشى Class جديد فىمجلد EntitiesModel وقم بتسميته TblUsers ويكون مثل TblProducts تماماً

لكتابة الـ Property فيه فقط أكتب كلمة prop ثم من لوحة المفاتيح اضغط على زر Tab مرتين سريعا

يظهر لك الـ Property بهذا الشكل


نغير نوع الحقل لأى نوع نريد حسب البيانات المدخلة int or string or decimal .... الخ

ايضا نغير MyProperty لإسم الحقل ويفضل إسم واضح ويعبر عن المدخلات لهذا الحقل 

سنتكلم فى الدرس القادم عن عمل Custom للـ property

يمكن كتابة 3 Property بهذا الشكل مثل الصورة وبنفس نوع البيانات


نفتح الكلاس MigrationsEntities.csو نكتب فيه كود تعريف الجدول الجديد بهذا الشكل .. مثل الكود الذى انشأه Wizard ايضا .


وطبعا عندنا connectionStrings مسبقا .. الامر الان متوقف على عملية Migrations ويكتب الكود الخاص به كما هو موضح بالصورة


يوجد 4حالات للـ Migrations Database Initializer 


1- الحالة الاولى إن كانت Database غير موجودة بالسيرفر يقوم هذا الكود بإنشائها .. وهو مناسب لتشغيل نظامك لأول مرة على جهاز العميل حيث يقوم بأنشائها من خلال ال Calsses و connectionStrings


Database.SetInitializer(new CreateDatabaseIfNotExists());
 

لاحظ ان CreateDatabaseIfNotExists تعنى انشاء قاعدة البيانات أن كانت غير موجودة ، ويحوى الـ Constructor المسمى <MigrationsEntities> أى الأكواد التى تجعله ينفذ الـ Migrations


وطبعا هنا الـ Migrations سينشئ قاعدة البيانات ان كانت غير موجود فى هذه الحالة سنحذف قاعدة البيانات والـ Migrations سيقوم بإنشاءها بالجدول القديم والجدول الجديد ايضا .. أذهب لـ SSMS ثم  Datebases ثم أحذف قاعدة البيانات MigrationsDb التى قمنا بإنشائها اول الدرس بهذا الشكل


لابد من قيام أى عملية على قاعدة البيانات لتنفيذ الـ Migrations .. إذهب Form الرئيسية وطبعا نحن انشأنا المشروع ولم نضيف ادوات ولا اكواد فى ال Form ..... أكتب فى حدث load_Form هذا الكود ثم اضغط على Ctrl + F5


 private void Form1_Load(object sender, EventArgs e)
        {
            using(MigrationsEntities db = new MigrationsEntities())   
            { 
                db.TblUsers.ToList();  
            } 
        }
 

بعد فتح ال Form ..... نذهب ل SSMS ونقف على Datebases ب Right Click ثم Refresh سنجد ان قاعدة البيانات تم إعادتها للسيرفر مرة آخرى، ثم عمل Expand من علامة + التى بجانب اسمها ثم التى بجانب Tables نجد ان الجدولين موجدين .. الاول الذى تم أنشائه ب Wizard والأخر الذى تم انشائه يدوى ب Migrations باإضافة لجدول 3 خاص بعملية ال Migrations اسمه __MigrationHistory كما هو موضح بالصورة

هذه العملية ذكية جدا حيث بمجرد تسمية ال Property لـ Id يقوم من نفسه بجعله حقل بمفتاح اساسى و تفعيل الترقيم التالقائى له من Identity Specification


2- الحالة الثانية وهى حذف ثم إعادة انشاء قاعدة البيانات مرة آخرىإذا كان هناك أختلاف بين Classes و Table Schema اى عند اضافة أو تغيير فى الModels اوClasses فإنه سيغير قاعدة البيانات ويتطابق مثلها .

وهى عملية منطقية لأن من الوارد تغيير تصميم قاعدة البيانات أو التعديل عليها حسب العمل المطلوب


Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
 


نفتح الـ Class المسمى بـ TblProducts ثم نعدل عليه كالاتى


public partial class TblProducts
    { 
        public int Id { get; set; }  

        [StringLength(50)]  
        public string ProductName { get; set; }  

        public decimal? ProductPrice { get; set; }  

        public virtual TblUsers UserId { get; set; }  
    } 
 


لاحظ اننا لم نضف لهذا ال Class سوى السطر الاخير public virtual TblUsersUserId{ get; set; }

وهو لعمل علاقة بين جدول المنتجات وجدول المستخدمين .

نقوم لعمل Rebuild للمشروع ثم Ctrl + F5


ملحوظة : أحيانا تظهر رسالة تفيد بأنه لا يمكن عمل Drop أو حذف لقاعدة البيانات لأنها مستخدمة مثل الصورة

فقط اغلق ssms ثم قم بعمل Ctrl + F5 مرة أخرى وسيعمل معك البرنامج

سيظهر لنا الان نافذة البرنامج أي انه تم تنفيذ الكود بدون مشاكل ، نقوم بفتح ssms من جديد ثم نذهب لمجلد Database Diagrams و Right Click ثم New Database Diagram ونختار الجدولين فقط اللذان نطبق عليهم الشرح TblProducts & TblUsers ثم نضغط Add .. سنجد العلاقة كما هي موضحة بالصورة


3 - الحالة الثالتة وهى تجمع بين الأولى والثانية ، فهى تقوم كل مرة بحذف قاعدة البيانات ثم إعادة بنائها دائما



Database.SetInitializer(new DropCreateDatabaseAlways());
 


يمكنك استخدامها في عمل البرامج التجربية بحيث عند اغلاق التطبيق يقوم بحذف قاعدة البيانات والمدخلات التي كان يجربها المستخدم

كما انها تعيد ترقيم حقل id الذى يحتوى على مفتاح اساسى من جديد



4 - الحالة الرابعة هي عمل Migrations اتوماتيك وهذه الطريقة مختلفة عن الطرق السابقة فهى تحتفظ بالبيانات في قاعدة البيانات وتقوم بتعديل Table Schema اذا تم اى تعديل على Models

في هذه الحالة سنحتاج الى إضافة ملفات Migrations الى المشروع من Nuget – Package Manager Console



من قوائم Visual Studio اختر  Tools >> Nuget Package Manager >> Package Manager Console



ثم نكتب الامر التالى في هذه النافذة لتفعيل الـ Migrations في المشروع



  enable-migrations -EnableAutomaticMigration:$true 
 


نجد هنا رسالة تفيد بأنه تم تفعيل الـ Migration على المشروع الذى قمنا بتسميته MigrationDatabaseInitializer كما هو موضح بالصورة

ونلاحظ أيضا انه تم إضافة مجلد للمشروع اسمه Migrations وبه Class باسم Configuration.cs

ثم نقوم بكتابة كود ال Migrations هذا داخل Constructor


Database.SetInitializer(new MigrateDatabaseToLatestVersion<MigrationsEntities, Configuration>());
 

نجد ان بعد علامة <MigrationsEntities , يوجد بارميتر آخر اسمه Configuration


من لوحة المفاتيح بقوم بالضغط على . + Ctrl ليظهر لنا اقتراح لحل المشكلة هذه وهى إضافة فضاء الأسماء الخاص بالمجلد المضاف من عملية Migrations وبها الـ Class المسمى بـ Configuration .


الان نجرب إضافة Property جديد للـ Class المسمى TblUsers الخاص بجدول المستخدمين

public string Email { get; set; }

ونضغط Ctrl + F5

يمكن ان يظهر لنا هذا الخطأ




الحل بسيط في ملف Configuration نجد بداخله Constructor بنفس الإسم


نكتب فيه الكود التالى والمؤشر عليه في الصورة



AutomaticMigrationDataLossAllowed = true;
 


نجرب الان اذا كانت قاعدة البيانات بها بيانات فسيتم عمل الـ Migrations بدون حذف البيانات الموجودة بها وسيتم إضافة الحقل الجديد في الجدول .


يمكنك اختيار اى نوع ستعمل به حسب فهمك للموضوع والمطلوب بمشروعك

سنتكلم عن الدرس القادم عمل ال Migrations لكن عن طريق Package Manager Console بالتفصيل أيضا .



الاسمبريد إلكترونيرسالة