- بواسطة x32x01 ||
ليه بنستخدم الـ Entity Framework بدل ما نكتب SQL بإيدينا؟ 

بص يا صديقي، كلنا مرينا بمرحلة إننا نكتب SQL Queries بإيدينا علشان نجيب Data من الـ Database.
الموضوع مكنش صعب، بس كان ممل جدًا… وتكرر كتير… ومليان تفاصيل ممكن نغلط فيها بسهولة.
غير إن أي غلطة صغيرة في كتابة الجملة أو الـ Parameters ممكن تفتحلك باب خطر اسمه SQL Injection!
هنا بقى بييجي دور Entity Framework أو اللي بنختصره بـ EF.
الـ EF مش مجرد مكتبة عادية… ده مترجم بين عالم الكود (زي C#) وعالم الـ Database (زي SQL Server أو MySQL).
يعني بدل ما تتعامل مع الـ Database على إنها جداول و Rows، بتتعامل معاها على إنها Objects و Classes، وده بيسهل الشغل جدًا وبيخلّي الكود مفهوم ومترتب وشيك
.
إيه هو الـ Entity Framework أصلاً؟
الـ EF هو مثال على مفهوم اسمه Object-Relational Mapper (ORM)، وده معناه ببساطة:
خلّينا نبسطها بمثال صغير جدًا:
بدل ما تكتب SQL كده:
بتكتب في C# كده:
الـ EF بياخد ال Query دي، ويترجمها لـ SQL، وينفذها، ويرجعلك Object جاهز تستخدمه.
يعني الموضوع بقى إنسيابي وسهل ومش محتاج مجهود.
ليه نستخدم الـ EF بدل ما نكمل SQL وخلاص؟
الناس مش بتستخدم EF "عشان كسل"… لا، هو بيحل 3 مشاكل أساسية:
1) مشكلة الـ "اختلاف التفكير" بين اللغة والـ Database
اللغة اللي بتبرمج بيها (زي C#) بتتعامل مع البيانات كـ Objects
لكن الـ Database بتتعامل معاها كـ جداول وصفوف.
فالـ EF بيشيل عنك حتة إنك تفضل تفكر إزاي تحول الـ Object لـ SQL والعكس.
وده بيخليك تركز في المنطق نفسه (Business Logic) بدل التفاصيل.
2) التخلص من الكود المكرر والممل
لما تستخدم SQL يدوي، هتكتب:
أما مع EF؟
خد بالك 
سطرين بالظبط بدل 20 سطر.
3) الأمان والـ SQL Injection
الـ EF بيتعامل مع Parameters جاهز، وبالتالي:
يعني لو هتنقل من SQL Server → PostgreSQL
مش هتعدل الكود… هتغير configuration فقط.
وده بيوفر وقت ومجهود مرعب
مشكلة الـ Lazy Loading والـ N+1
بص، الـ EF ذكي… مش بيجيب Data إلا لما تطلبها.
وده اسمه Lazy Loading
المشكلة؟
لو عندك Customer وعايز تجيب الـ Orders بتاعته:
وده هيخلي EF يعمل:
يعني لو عندك 100 عميل؟
يبقى عملت 101 Query
وده اللي بنسميه N+1 Problem
وبيبوّظ الأداء بشكل فظيع.
الحل: استخدم Eager Loading
ده بيقول للـ EF:
"هّات كل العملاء ومع كل واحد منهم الـ Orders بتاعته… في Query واحدة."
وده بيفرق في الأداء بشكل غير طبيعي

مثال عملي كامل
3) جلب العملاء ومعاهم الطلبات
الموضوع فعلاً أسهل وأشيك وأأمن.
طب هل نستخدم EF في كل الحالات؟
لأ… بصراحة لأ.
لو التطبيق بتاعك:
ساعاتها نكتب SQL مباشرة بس بشكل Controlled
لكن ده بيكون استثناء مش قاعدة.
الخلاصة
Entity Framework بيوفر لك:
يعني باختصار:
EF مش للرفاهية… ده بيوفر وقت، مجهود، وأمان.
بص يا صديقي، كلنا مرينا بمرحلة إننا نكتب SQL Queries بإيدينا علشان نجيب Data من الـ Database.
الموضوع مكنش صعب، بس كان ممل جدًا… وتكرر كتير… ومليان تفاصيل ممكن نغلط فيها بسهولة.
غير إن أي غلطة صغيرة في كتابة الجملة أو الـ Parameters ممكن تفتحلك باب خطر اسمه SQL Injection!
هنا بقى بييجي دور Entity Framework أو اللي بنختصره بـ EF.
الـ EF مش مجرد مكتبة عادية… ده مترجم بين عالم الكود (زي C#) وعالم الـ Database (زي SQL Server أو MySQL).
يعني بدل ما تتعامل مع الـ Database على إنها جداول و Rows، بتتعامل معاها على إنها Objects و Classes، وده بيسهل الشغل جدًا وبيخلّي الكود مفهوم ومترتب وشيك
إيه هو الـ Entity Framework أصلاً؟
(ORM بشكل بسيط من غير فلسفة)
الـ EF هو مثال على مفهوم اسمه Object-Relational Mapper (ORM)، وده معناه ببساطة:- Object → الكلاس اللي في الكود (زي Class Customer)
- Relational → الجداول اللي في قاعدة البيانات
- Mapper → الأداة اللي بترجم بين الاتنين... وده دور EF
خلّينا نبسطها بمثال صغير جدًا:
بدل ما تكتب SQL كده:
SQL:
SELECT * FROM Customers WHERE CustomerId = 5; بتكتب في C# كده:
C#:
var customer = context.Customers
.Where(c => c.Id == 5)
.FirstOrDefault(); يعني الموضوع بقى إنسيابي وسهل ومش محتاج مجهود.
ليه نستخدم الـ EF بدل ما نكمل SQL وخلاص؟
الناس مش بتستخدم EF "عشان كسل"… لا، هو بيحل 3 مشاكل أساسية:1) مشكلة الـ "اختلاف التفكير" بين اللغة والـ Database
vs
اللغة اللي بتبرمج بيها (زي C#) بتتعامل مع البيانات كـ Objectsلكن الـ Database بتتعامل معاها كـ جداول وصفوف.
فالـ EF بيشيل عنك حتة إنك تفضل تفكر إزاي تحول الـ Object لـ SQL والعكس.
وده بيخليك تركز في المنطق نفسه (Business Logic) بدل التفاصيل.
2) التخلص من الكود المكرر والممل
(Boilerplate)
لما تستخدم SQL يدوي، هتكتب:- Open Connection
- Prepare Query
- Execute Reader
- Convert Data → Object
- Close Connection
أما مع EF؟
C#:
var product = new Product { Name = "Mouse", Price = 150 };
context.Products.Add(product);
context.SaveChanges(); سطرين بالظبط بدل 20 سطر.
3) الأمان والـ SQL Injection
الـ EF بيتعامل مع Parameters جاهز، وبالتالي:- بيوفر حماية تلقائية من SQL Injection

- الكود أكثر أمانًا

يعني لو هتنقل من SQL Server → PostgreSQL
مش هتعدل الكود… هتغير configuration فقط.
وده بيوفر وقت ومجهود مرعب
مشكلة الـ Lazy Loading والـ N+1
(التراب اللي ناس كتير بتقع فيه)
بص، الـ EF ذكي… مش بيجيب Data إلا لما تطلبها.وده اسمه Lazy Loading
المشكلة؟
لو عندك Customer وعايز تجيب الـ Orders بتاعته:
C#:
var customers = context.Customers.ToList();
foreach (var c in customers)
{
Console.WriteLine(c.Orders.Count());
} وده هيخلي EF يعمل:
- 1 Query تجيب العملاء
- Query لكل عميل علشان يجيب الـ Orders
يعني لو عندك 100 عميل؟
يبقى عملت 101 Query
وده اللي بنسميه N+1 Problem
وبيبوّظ الأداء بشكل فظيع.
الحل: استخدم Eager Loading
C#:
var customers = context.Customers
.Include(c => c.Orders)
.ToList(); "هّات كل العملاء ومع كل واحد منهم الـ Orders بتاعته… في Query واحدة."
وده بيفرق في الأداء بشكل غير طبيعي
مثال عملي كامل
(من أول إنشاء نموذج للتعامل مع البيانات)
1) Class للعميل
C#:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public List<Order> Orders { get; set; } = new();
} 2) Class للأوردر
C#:
public class Order
{
public int Id { get; set; }
public decimal Price { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
} 3) جلب العملاء ومعاهم الطلبات
C#:
var customers = context.Customers
.Include(c => c.Orders)
.ToList(); 4) إضافة عميل جديد
C#:
var cust = new Customer { Name = "Mostafa" };
context.Customers.Add(cust);
context.SaveChanges(); الموضوع فعلاً أسهل وأشيك وأأمن.
طب هل نستخدم EF في كل الحالات؟
لأ… بصراحة لأ.لو التطبيق بتاعك:
- بيحتاج Performance عالي جدًا جدًا
- أو Queries معقدة جدًا
ساعاتها نكتب SQL مباشرة بس بشكل Controlled
لكن ده بيكون استثناء مش قاعدة.
الخلاصة
Entity Framework بيوفر لك:| الميزة | تأثيرها |
|---|---|
| كود أنضف وأسهل | |
| سرعة في التطوير | |
| أمان أعلى | |
| مرونة في نقل الـ Database | |
| أداء كويس مع الاستخدام الصح |
EF مش للرفاهية… ده بيوفر وقت، مجهود، وأمان.