السلام عليكم ورحمة الله وبركاتة
عندما أطلقت شركة مايكروسوف الأصدار 3.5 للـ NET. مع برنامج الـ Visual Studio 2008, أتت مصحوبة بـبدايات الـ Entity Framework وهو بتعريف بسيط وشخصي طريقة تساعد المطور على تمثيل قاعدة البيانات على شكل Objects أو بصيغة يستطيع المطور من التعامل معها بأستخدام اللغة التي يستخدمها للبرمجة, وفي الحقيقة هذا ما هو الا ملف ذو صيغة XML بحمل الأمتداد EDMX حيث يراه المستخدم بما يعرف بـ designer.
وعندما أطلقت مايكروسوف الأصدارة 4 من الـ NET. مع الـ Visual Studio 2010 أتت الأصدارة الثانية من الـ Entity Framework و صاحبها تعريف جديد يعرف بـ Model First حيث و بأختصار شديد تكون العملية عكسية وذلك بقيام المطور من تصميم الـ conceptual model أولاً ومن ثم يقوم بإنشاء قاعدة البيانات بالأعتماد على هذا الـ model.
مع وجود هذه الطرق للتعامل مع قاعدة البيانات سواء أن قرر المطور أن يعمل على قاعدة البيانات من البداية أو كانت هذه القاعدة موجودة, مايكروسوفت أضافت طريقة جديدة لـ Modeling وتم تسميتها بـما يعرف بـ Code First. وهذه الطريقة تجعلك كمطور تقوم بأنشاء الـ Model الخاص بك بواسطة الـ code من بدلا من أستخدام الـ XML كما ذكرت سابقا. على سبيل المثال لو أرد المطور أن تكون قاعدة البيانات الخاصة به تحتوي على جدول للموظفين فكل ما سيحتاجة لتمثيل هذا الجدول بواسطة الـ Code First هو أنشاء Class يحتوي على خصائص(Properties) كالتالي:
ملاحظة: تم أستخدام مشروع من نوع console application لتنفيذ الأكواد التالية..
public class Employees
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}وهذا ما يطابق جدول أسمة Employees يحتوي على ثلاثة حقول وهم EmployeeId, Name و Age. و في الخطوة الثانية من مراحل أنشاء قاعدة البيانات لابد أن يقوم المطور بعمل, لنسمية الوسيط بين هذه الـ Classes و قاعدة البيانات عند أنشائها, و في العادة مايعرف بـ Context. و بكل بساطة هو يشبهه ما نفعله عندما ننشئ قاعدة البيانات بأستخدام ملف الـ EDMX أي طريقة السحب والافلات لجداول هذه القاعدة في هذا الملف ( ملف EDMX ) و بعد ذلك عندما نريد أن نتصل بقاعدة البيانات نستدعي أسم هذا الملف بهذه الطريقة:-
using(MyDatabaseEntities db = new MyDatabaseEntities())
{
var employee = db.Employees.ToList();
}و لكن عندما نستخدم الـ Code First سوف نعمل مثل هذه الطريقة و لكن بالـ Code أيضاً, وذلك بواسطة ما يعرف بـ DbContext API.
و كتعريف بسيط للـ DbContext API هي عبارة عن نسخة أخف من الـ ObjectContext التي تٌستخدم في الـ Entity Framework عندما نعمل querying لقاعدة البيانات والتي تقدم لنا دوال على سبيل المثال ()SaveChanges التي يتم أستخدامها عندما نريد الحفظ في قاعدة البيانات و الخ...
و الطريقة لعمل هذا, هي عن طريق أنشاء Class يكون Inherits من الـ DbContext, وبعدها تحديد الجدوال التي سنتعامل معها في هذه الـ Context وذلك بإستخدام ما يعرف بـ DbSet كالتالي:-
public class MyOfficeContext : DbContext
{
public DbSet<Employees> Employees { get ; set; }
}كما ذكرت سابقاً عند أستخدام طريقة السحب والأفلات للجداول في ملف الـ EDMX, وعندما نريد الأتصال بقاعدة البيانات نستخدم أسم هذا الملف للوصول للجداول التي موجودة به كالتالي:-
using(MyDatabaseEntities db = new MyDatabaseEntities())
{
var employee = db.Employees.ToList();
}أما عند أستخدام الـ Code First الفرق بأن أسم الـ Context هو أسم الـ Class الذي تم أنشائه وهو MyOfficeContext ليصبح الكود كالتالي:-
using(MyOfficeContext db = new MyOfficeContext ())
{
var employee = db.Employees.ToList();
}و بعد ذلك عرفنا DbSet وبها أسم الـ Class ليكون هو الوسيط بين قاعدة البيانات والكود الذي سوف نقوم بكتابة كما فعلنا في الكود السابق
var employee = db.Employees.ToList();
وفي هذه الخطوة نكون قد أنتهينا من تعريف قاعدة البيانات وما تبقى هو أنشاء هذه القاعدة.
ملاحظة: توجد أعدادات لم أتطرق لها وذلك لسبب أن الموضوع عبارة عن تعريف بسيط لطريقة أستخدام الـ Code First.
الأن بوجود Context و Classes نستطيع كتابة Query ويفضل كتابة Query لأضافة بيانات لكي يقوم الـ Code First بإنشاء هذه القاعدة كالتالي:
var emp = new Employees()
{
Name = "Test",
Age = 25
};
using(MyOfficeContext db = new MyOfficeContext())
{
db.Employees.Add(emp);
db.SaveChanges();
}ملاحظة: أنا لم أقم بتعريف أي Connection string لهذه القاعدة, فما تقوم به الـ Code First هو أنشائها بواسطة الـ local server وفي العادة ما يكون SQLEXPRESS ولو فتحنا برنامج Sql Server Management Studio سنلاحظ وجود هذه القاعدة وتحمل أسم الـ Namespace الذي كتبنا فيه Class الـ Context مع أسم هذا الـ Class. على سبيل المثال لنفرض أن أسم الـ Namespace هو MyProject فـ سيكون الناتج كالتالي:
MyProject.MyOfficeContext
سنلاحظ أن الـ Code First قامت بعمل ممتاز في أنشاء قاعدة البيانات وأيضاً سنلاحظ أنها عرفت مفتاح أساسي للجدول وهو الـ EmployeeId وهذه أحدى الـ Conventions التي تتبعها الـ Code First لأنشاء المفتاح الأساسي وهي برؤية أي حقل يكون متبوع بكلمة Id فأنها تعاملة على أنه حقل أساسي.
في الختام توجد هناك أعدادات كثيرة لم أتطرق لها وهذا الموضوع ما هو الأ تعريف بسيط لهذه التقنية وفي الحقيقة رأيت لها دور كبير عندما أستخدمتها مع الـ ASP.NET MVC