- بواسطة x32x01 ||
Entity Framework Core: إزاي تخلي الداتابيز تتكلم C#
عمرك كتبت كود شغال تمام التمام… لكن وإنت بتتعامل مع الداتابيز تحس إنكم مش فاهمين بعض؟
إنت بتتكلم C#… وهي بترد عليك بـ SQL…
كأنكم في مكالمة Zoom والصوت بيقطع
هنا بقى بييجي دور Entity Framework Core، اللي بيخلّيك تكلم الداتابيز بلغة C# نفسها، كأنها جزء طبيعي من الكود بتاعك.
يعني:
إنت بتكتب C#، وهو يترجم الكلام ده لـ SQL، ينفذ الـ Query، ويرجعلك النتائج Objects جاهزة.
من غير ما تكتب SQL بنفسك.
بتكتب:
نفس النتيجة 
بس الكود بقى:
فيه نقطتين لازم تفهمهم كويس جدًا لو عايز أداء عالي:
الاتنين شبه بعض… لكن الفرق بينهم ضخم:
وكتبت الكود ده:
اللي بيحصل في الخلفية هو:

Query واحدة فيها JOIN → أداء أسرع بكتير 
الخلاصة
بس! لازم تكون فاهم EF بيفكر إزاي…
عشان بدل ما يساعدك → مايبقاش هو سبب البطء
عمرك كتبت كود شغال تمام التمام… لكن وإنت بتتعامل مع الداتابيز تحس إنكم مش فاهمين بعض؟
إنت بتتكلم C#… وهي بترد عليك بـ SQL…
كأنكم في مكالمة Zoom والصوت بيقطع
هنا بقى بييجي دور Entity Framework Core، اللي بيخلّيك تكلم الداتابيز بلغة C# نفسها، كأنها جزء طبيعي من الكود بتاعك.
الفكرة ببساطة: ORM
EF Core هو ORM (Object-Relational Mapper).يعني:
| في الكود | في الداتابيز |
|---|---|
| class Product | جدول Products |
| product.Name | عمود Name |
| List<Product> | Rows جوه الجدول |
من غير ما تكتب SQL بنفسك.
مثال سريع
بدل ما تكتب: C#:
string query = "SELECT * FROM Products";
var products = ExecuteQuery(query); C#:
var products = context.Products.ToList(); بس الكود بقى:
- أوضح
- أقل
- أسهل في الصيانة
طب حلو… فين المشكلة؟
المشكلة إن EF Core ذكي… بس ممكن يفهمك غلط لو إنت مش فاهمه.فيه نقطتين لازم تفهمهم كويس جدًا لو عايز أداء عالي:
1) الفرق بين IQueryable و IEnumerable
بص على الكودين دول: C#:
var products = context.Products.Where(p => p.Price > 100).ToList(); C#:
var products = context.Products.ToList().Where(p => p.Price > 100); | السطر الأول | السطر الثاني |
|---|---|
| الفلترة بتحصل في الداتابيز نفسها | الفلترة بتحصل في الـ RAM بعد ما يجيب كل الداتا |
| سريع و efficient | بطيء وضار جدًا للأداء |
الخلاصة:
- طول ما إنت شغال على الداتابيز → اشتغل بـ IQueryable
- أول ما تعمل .ToList() → الـ Query اتنفذت خلاص
2) مشكلة الـ N+1 (اللي بتبطّل السيرفر من غير ما تحس)
تخيل عندك Categories وكل Category ليها Products.وكتبت الكود ده:
C#:
var categories = context.Categories.ToList();
foreach (var category in categories)
{
foreach (var product in category.Products)
{
Console.WriteLine(product.Name);
}
} اللي بيحصل في الخلفية هو:
- Query عشان يجيب الـ Categories →

- وبعدين Query لكل Category عشان يجيب الـ Products →

الحل: Eager Loading
C#:
var categories = context.Categories
.Include(c => c.Products)
.ToList(); الخلاصة
| بدون EF Core | مع EF Core |
|---|---|
| تكتب SQL كتير | تكتب C# بس |
| كود أطول | كود أقصر |
| صيانة صعبة | صيانة أسهل |
| أخطاء injection محتملة | حماية تلقائية |
عشان بدل ما يساعدك → مايبقاش هو سبب البطء