الـ 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
) بالسلب.