ORM لـ C# (.NET): مقارنة Entity Framework Core و Dapper و NHibernate
عند تطوير التطبيقات بلغة C# (.NET)، يمكن أن يؤثر اختيار ORM (تعيين الكائنات العلائقية) المناسب بشكل كبير على الأداء وسرعة التطوير وقابلية صيانة الكود. في هذه المقالة، سنقارن بالتفصيل ثلاثة من أشهر ORM في نظام .NET البيئي: Entity Framework Core (EF Core) و Dapper و NHibernate. ستتعرف على نقاط القوة والضعف لكل منها، بالإضافة إلى رؤية أمثلة محددة على الكود.
ما هو ORM ولماذا هو مطلوب؟
ORM هي تقنية تتيح العمل مع قواعد البيانات من خلال كائنات لغة البرمجة، بدلاً من استعلامات SQL المباشرة. بالنسبة لـ C# (.NET)، يقوم ORM بأتمتة تعيين الجداول إلى الفئات، وتوليد SQL، وتتبع التغييرات، وإدارة المعاملات. هذا يسرع التطوير، ولكنه قد يؤدي إلى فقدان الأداء عند الاستخدام غير الصحيح.
1. Entity Framework Core (EF Core)
EF Core هو إصدار حديث وخفيف وقابل للتوسع من Entity Framework من Microsoft. إنه ORM كامل الميزات مع مزود LINQ قوي، وترحيلات تلقائية، ودعم للعديد من أنظمة إدارة قواعد البيانات (SQL Server، PostgreSQL، SQLite، MySQL، وغيرها).
المزايا:
- سرعة عالية في التطوير بفضل نهجي Code-First و Database-First.
- بناء جملة LINQ قوي لكتابة الاستعلامات.
- تتبع تلقائي للتغييرات (Change Tracker).
- دعم مدمج للترحيلات (Migrations).
العيوب:
- أبطأ مقارنة بـ ORM الصغير (بسبب النفقات العامة للتتبع).
- صعوبات في تحسين الاستعلامات المعقدة (مشكلة N+1).
مثال على الكود (EF Core):
// النموذجpublic class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}
// سياق قاعدة البياناتpublic class AppDbContext : DbContext{ public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\\mssqllocaldb;Database=MyDb;"); }}
// الاستخدامusing (var db = new AppDbContext()){ // الإضافة db.Users.Add(new User { Name = "إيفان", Email = "ivan@example.com" }); db.SaveChanges(); // الاستعلام عبر LINQ var users = db.Users.Where(u => u.Name.StartsWith("إ")).ToList(); // الإخراج foreach (var user in users) { Console.WriteLine($"{user.Id}: {user.Name}"); }}2. Dapper
Dapper هو ORM صغير (Micro-ORM) تم إنشاؤه بواسطة فريق Stack Overflow. لا يضيف أي نفقات عامة تقريبًا ويعمل مباشرة مع ADO.NET. يعتبر Dapper مثاليًا للمشاريع التي يكون فيها الأداء والتحكم الكامل في SQL أمرًا بالغ الأهمية.
المزايا:
- أقصى أداء (قريب من استعلامات ADO.NET الخام).
- البساطة والحد الأدنى (ملف واحد، عدد قليل من طرق الامتداد).
- تحكم كامل في استعلامات SQL.
- سهولة التكامل في المشاريع الحالية.
العيوب:
- لا يوجد تتبع للتغييرات (كل شيء يدوي).
- لا توجد ترحيلات تلقائية.
- يتطلب كتابة استعلامات SQL يدويًا.
مثال على الكود (Dapper):
public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}
// استخدام Dapperusing (var connection = new SqlConnection(@"Server=(localdb)\\mssqllocaldb;Database=MyDb;")){ connection.Open(); // الإدراج var sqlInsert = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)"; connection.Execute(sqlInsert, new { Name = "بيتر", Email = "petr@example.com" }); // الاستعلام