الـ Entity Framework Core أو زي ما بنقول عليه اختصارًا (EF Core)، ده عبارة عن ORM (Object-Relational Mapping). ببساطة كده، هو أداة بتخليك تتعامل مع الـ Database بتاعتك بسهولة جدًا، كأنك بتتعامل مع Classes عادية في الكود بتاعك بدل ما تقعد تكتب SQL بإيدك.

إيه مميزات الـ EF Core؟
الـ EF Core بيقدم شوية مميزات بتسهل الدنيا على المبرمجين:
- الـ Abstraction: الـ EF Core بيخليك تبص لكل جدول في الـ
Databaseعلى إنهModelأوClass. يعني إنت بتتعامل مع الـDatabaseكأنهاCollectionمن الـObjectsوخلاص. - الـ Rapid Development: مش هتحتاج تكتب
SQL Queriesمعقدة أوStored Proceduresبنفسك. هتستخدم حاجة اسمها LINQ عشان تعمل الـ CRUD Operations اللي هما (Create, Read, Update, Delete) بسهولة وسرعة. - الـ Maintainability: لو عدلت أي حاجة في الـ
Modelsبتاعتك، التعديل ده بيسمّع على طول في شكل الـ Database Schema. الصيانة بتبقى أسهل بكتير. - الـ Lazy Loading: الـ EF Core ممكن يجيب الداتا حتة حتة (on-demand) بدل ما يحمل كل حاجة مرة واحدة. ده بيحسن الـ Performance في بعض الحالات (ممكن تقرا أكتر عن استراتيجيات تحميل الداتا زي Lazy Loading vs Eager Loading).
- الـ Multi-Database Support: الـ EF Core بيدعم أنواع كتير من الـ
DatabasesزيSQL Server،SQLite،MySQLوغيرها.
استراتيجيات الـ Inheritance Mapping
لما يكون عندك Classes بتورث من بعضها (Inheritance Hierarchies), الـ EF Core محتاج يعرف إزاي يمثل الوراثة دي في الـ Database. فيه كذا طريقة أو استراتيجية للموضوع ده (اتكلمنا عن الفرق بينهم كلهم بالتفصيل هنا Inheritance Mapping). الاستراتيجية بتحدد الـ Schema اللي الـ EF Core هيمشي عليه وهو بيحول الكود بتاعك لجداول في الـ Database.
عندك كذا طريقة عشان تحول الـ Inheritance Hierarchies دي للـ Database:
Table Per Hierarchy (TPH)
- دي الطريقة الافتراضية في الـ EF Core.
- كل الـ
Classesاللي في سلسلة الوراثة بيتخزنوا في جدول واحد (Table) بس. - بيكون فيه عمود زيادة اسمه
Discriminator columnعشان يفرق بين أنواع الـObjectsالمختلفة في نفس الجدول. - عيبها إن ممكن يبقى عندك قيم
NULLكتير في الجدول، وده يعتبر إهدار في مساحة التخزين (Storage).
Table Per Type (TPT)
- هنا، الـ EF Core بيعمل جدول (
Table) منفصل لكلTypeأوClassفي سلسلة الوراثة. - ده ممكن يخلي عمليات الـ
CRUDأبطأ شوية أو تعمل Overhead زيادة، عشان هتحتاج تعمل Joins كتير بين الجداول. - مشاكل الأداء في الـ TPT:
- لو جيت تضيف موظف جديد بدوام كامل (
Full Time Employee)، هتحتاج تضيف بياناته في جدول الموظفين الأساسي (Employee) وكمان في جدول موظفين الدوام الكامل (Full Time Emp). يعني هتضيف في جدولين. - لو جيت تجيب بيانات موظف بدوام جزئي (
Part Time emp)، هتحتاج تجيب اسمه وعمره مثلًا من جدولEmployeeوباقي بياناته من جدولPart Time Emp. ده معناه إنك هتعملJoinبين الجدولين. - باختصار، أي عملية
CRUDهتحتاج تتعامل مع جدولين، وده مش أحسن حاجة من ناحية التصميم (Design) والأداء (Performance).
- لو جيت تضيف موظف جديد بدوام كامل (
Table Per Concrete Class (TPCC)
- هنا الـ EF Core بيعمل جدول (
Table) منفصل لكلConcrete Classبس. - الـ
Concrete Classهي أيClassليها تمثيل حقيقي في الـBusinessبتاعك (في مثالنا زيFull Time EmployeeوPart Time Employee، لكن مش الـClassالأساسية زيEmployeeلو كانتabstractمثلًا). - لازم تتأكد إن نسخة
EF Coreاللي بتستخدمها بتدعم النوع ده (بقى مدعوم رسميًا في EF Core 7 والإصدارات الأحدث).
ملاحظة مهمة: الطريقة الافتراضية والأكتر استخدامًا هي الـ
TPH، وعادةً بتعتبر الأفضل من ناحية البساطة والأداء (Performance) في معظم الحالات.
مقارنة: ADO.NET vs Entity Framework Core vs Dapper
لو محتار تستخدم إيه عشان تتعامل مع الـ Database في مشاريع الـ .NET، تعالى نقارن بين أشهر تلات أدوات: ADO.NET, EF Core, و Dapper.
ممكن تقرا المقال ده لمعلومات أكتر: Dapper vs Entity Framework Core vs ADO.NET: Which One Should You Choose?
1. ADO.NET
(اتكلمنا عنها بالتفصيل هنا ADO DotNet)
- أول حاجة لازم تعرفها إن
ADO.NETمش ORM. بيتقال عليهاdatabase access technologyأوlow-level tool. - دي الطريقة “اليدوية” والأساس اللي اتبنت عليه كل أدوات الـ .NET التانية للتعامل مع الـ
Database. - بتستخدم
ClassesزيSqlConnection,SqlCommand,SqlDataReaderوغيرها عشان تكتب وتنفذSQL Queriesبنفسك. - بتديك تحكم كامل في كل تفصيلة، من أول الـ
Connectionsلحد الـQueries. - الأداء (
Performance) بتاعها عالي جدًا لأن مفيش أي طبقات وسيطة كتير، بتكلم الـDatabaseبشكل مباشر. - لكن عيبها إن الكود بيكون أكتر بكتير، تفصيلي، وممكن يتكرر، والصيانة ممكن تبقى صعبة في المشاريع الكبيرة.
2. EF Core (Entity Framework Core)
- ده يعتبر ORM كامل (
Object Relational Mapping). بيخليك تحول الـDatabaseلعالم الـ .NETClassesوتتعامل مع الداتا باستخدامLINQوكأنهاObjects. - بيوفر عليك كتابة
SQLوتفاصيلADO.NETالكتير عن طريق الـabstractionوالـmappingاللي بيعمله بين الـModelsوالجداول. - It provides a set of classes and APIs that abstract the database operations. (يعني بيقدم مجموعة
ClassesوAPIsبتبسط عمليات الـDatabase). - EF Core is built on top of ADO.NET, which means it uses ADO.NET internally to interact with databases. (يعني هو مبني فوق
ADO.NETوبيستخدمه في الخلفية عشان يكلم الـDatabase). - مناسب جدًا للتطوير السريع (
Rapid Development) والصيانة الأسهل (Maintainability). - عيبه إنه ممكن يكون أبطأ شوية من
ADO.NETأوDapperفي بعض الحالات بسبب الـOverheadبتاع الـabstractionوالمميزات الزيادة زي الـ Change tracking.
3. Dapper
(اتكلمنا عنها بالتفصيل هنا Dapper)
- ده بيتقال عليه Micro ORM. يعني
ORMصغير وخفيف. - هو عبارة عن طبقة بسيطة فوق
ADO.NET، عملها فريقStackOverflow. - تصميمه خفيف جدًا وسريع جدًا. بيستخدم Extension Methods على الـ
IDbConnectionعشان يسهل تنفيذ الـSQLوتحويل النتائج لـObjectsبسهولة. - مش بيقدم كل مميزات الـ ORM الكامل زي
EF Core. يعني مش هتلاقي فيه مثلًاchange trackingأو Automatic migrations. - لكنه بيكون أسرع بكتير من
EF Coreفي العمليات البسيطة والمعاملات الكبيرة لأنه بيقلل التعقيد والـabstraction. - عادةً بيستخدمه المبرمجين اللي محتاجين أداء عالي جدًا (
Performance) ومش فارق معاهم يكتبواSQLبنفسهم، بس عايزين يستفيدوا من سهولة تحويل النتائج لـObjects.
مقارنة شاملة بين التلاتة
تعالى نبص على مقارنة أوضح بين EF Core, Dapper, و ADO.NET من كذا ناحية:
الأداء (Performance)
- الـ ADO.NET: زي ما قلنا، دي الطريقة اليدوية. بتكتب
SQLوتتعامل مع كل حاجة بنفسك (SqlConnection,SqlCommand). عشان كده الأداء هنا هو الأعلى غالبًا. - الـ Dapper:
Micro ORMخفيف مبني فوقADO.NET. أداءه قريب جدًا منADO.NETلأنه بيعمل بس عمليةMappingبسيطة للـObjectsومش بيضيفOverheadكتير. يعني سريع جدًا. - الـ EF Core: بيقدم مميزات كتير زي
LINQ,change tracking, Automatic migrations وغيرها. المميزات دي بتيجي معاها شويةOverheadبيخليه أبطأ نسبيًا مقارنة بـDapperوADO.NET.
سهولة الاستخدام (Ease of Use)
- الـ EF Core: بيوفر
APIعالي المستوى (high-level) بيخلي التعامل مع الداتا سهل جدًا عن طريق الـClassesوالـLINQبدل كتابةSQL. يعتبر الأسهل في الاستخدام والتطوير السريع. - الـ Dapper: سهل نسبيًا، بس لازم تكتب
SQLبنفسك. هو بيسهل بس عملية الـmappingللـObjectsبدون تعقيد. - الـ ADO.NET: الأكتر تعقيدًا وتفصيلًا. محتاج تكتب كود كتير وتتعامل مع تفاصيل كتير (
low-level) زي إدارة الـConnectionوكتابة الـQueries.
المزايا والميزات (Features)
- الـ EF Core: مليان مميزات زي
automatic schema migrationsوchange tracking. لو عايز ORM متكامل ومليان خصائص،EF Coreهو الأنسب. - الـ Dapper: بيقدم وظايف سريعة وخفيفة للـ
object mapping. لكن مفيهوش المميزات التقيلة اللي فيEF Coreزي الـchange trackingأوautomatic migrations. - الـ ADO.NET: مفيهوش أي مميزات ORM؛ إنت بتعمل كل حاجة بنفسك. مش هتلاقي
LINQولاautomatic migrationsولا الكلام ده.
المرونة (Flexibility)
- الـ Dapper: يمكن يكون الأكتر مرونة. بما إنك بتكتب
SQLبنفسك، بتقدر تعملmappingلأيClassأوStructureمحتاجها من غير قيود كتير. - الـ EF Core: أقل مرونة شوية لأنه بيعتمد بشكل كبير على الـ
Modelsوالتخطيط المسبق للجداول وعلاقاتها. - الـ ADO.NET: مرن جدًا برضه لأنك بتتحكم في كل حاجة، بس المرونة دي بتيجي على حساب كتابة كود أكتر وتفاصيل أكتر.
الخلاصة: أختار مين فيهم؟
- الـ ADO.NET: لو أهم حاجة عندك هي أعلى أداء ممكن وتحكم كامل ودقيق (
fine-grained control) في كل تفصيلة، ومستعد تكتب كود كتير وتتعامل مع التفاصيل بنفسك. - الـ EF Core: لو عايز تطور بسرعة وسهولة، وتستخدم
ORMمتكامل بمميزات كتير زيLINQوautomatic migrationsوchange tracking، ومستعد تضحي بشوية أداء مقابل السهولة دي. - الـ Dapper: لو الأداء العالي (
Performance) مهم جدًا ليك (قريب منADO.NET)، وفي نفس الوقت عايز مرونة في كتابة الـSQLواستفادة من سهولة الـmapping، ومش محتاج كل المميزات التقيلة بتاعةEF Core.
في الآخر، اختيار الأداة الصح بيعتمد على متطلبات مشروعك من ناحية الأداء المطلوب، سرعة التطوير، والمميزات اللي إنت محتاجها.
معلومة إضافية: زي ما قلنا فوق، الطريقة الافتراضية في
EF Coreلتمثيل الوراثة هيTPH. لو استخدمتTPT، غالبًا هتلاقي نفسك بتعملJoinsأكتر بين الجداول، وده ممكن يأثر على الأداء (Performance) بالسلب.