الفرق بين Entity Framework و SQL العادي

x32x01
  • بواسطة 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 أصلاً؟ 🧠 (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 بياخد ال Query دي، ويترجمها لـ SQL، وينفذها، ويرجعلك Object جاهز تستخدمه.

يعني الموضوع بقى إنسيابي وسهل ومش محتاج مجهود.



ليه نستخدم الـ 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 ✅
  • الكود أكثر أمانًا ✅
غير إنه بيسهّل عليك جدًا إنك تغير الـ Database Engine
يعني لو هتنقل من 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();
ده بيقول للـ EF:
"هّات كل العملاء ومع كل واحد منهم الـ 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 بيوفر لك:
الميزةتأثيرها
كود أنضف وأسهل✅ بتفهم الكود أسرع
سرعة في التطوير✅ بتنجز أسرع
أمان أعلى✅ حماية من SQL Injection
مرونة في نقل الـ Database✅ بدون تغيير الكود
أداء كويس مع الاستخدام الصح✅ استخدم Include() صح
يعني باختصار:
EF مش للرفاهية… ده بيوفر وقت، مجهود، وأمان.
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
823
x32x01
x32x01
x32x01
الردود
0
المشاهدات
465
x32x01
x32x01
x32x01
الردود
0
المشاهدات
156
x32x01
x32x01
x32x01
الردود
0
المشاهدات
791
x32x01
x32x01
x32x01
الردود
0
المشاهدات
1K
x32x01
x32x01
x32x01
الردود
0
المشاهدات
432
x32x01
x32x01
x32x01
الردود
0
المشاهدات
517
x32x01
x32x01
x32x01
الردود
0
المشاهدات
712
x32x01
x32x01
x32x01
الردود
0
المشاهدات
547
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
1,983
المشاركات
2,183
أعضاء أكتب كود
479
أخر عضو
as6318380@gmail
عودة
أعلى