ترحيلات قواعد البيانات في C# (.NET): دليل شامل
إدارة تغييرات مخطط قاعدة البيانات هي مهمة بالغة الأهمية عند تطوير أي تطبيق بلغة C# (.NET). تتيح الترحيلات إمكانية إصدار وتتبع وتطبيق تغييرات هيكل قاعدة البيانات (إضافة جداول، أعمدة، فهارس) بشكل تلقائي ومتزامن مع كود التطبيق. في النظام البيئي لـ .NET، توجد عدة أدوات ناضجة لهذه المهمة. في هذه المقالة، سنشرح بالتفصيل ثلاثة أساليب رئيسية: الآلية المدمجة في Entity Framework Core، والمكتبات المتخصصة FluentMigrator و DbUp.
1. ترحيلات Entity Framework Core (EF Core)
الطريقة الأكثر شيوعًا للمشاريع التي تستخدم بالفعل ORM Entity Framework Core. الترحيلات مدمجة بشكل وثيق مع نموذج البيانات الخاص بك (نهج Code-First).
التثبيت والإعداد
للعمل مع الترحيلات، ستحتاج إلى تثبيت الحزمة:
dotnet add package Microsoft.EntityFrameworkCore.Toolsإنشاء وتطبيق الترحيل
بعد تعديل نماذج C# الخاصة بك (مثل إضافة خاصية جديدة Email إلى الفئة User)، قم بتنفيذ الأمر التالي في الطرفية:
dotnet ef migrations add AddEmailToUserdotnet ef database updateالأمر الأول سينشئ ملف ترحيل بكود تم إنشاؤه تلقائيًا بلغة C#. الأمر الثاني سيطبقه على قاعدة البيانات الخاصة بك.
مثال على كود الترحيل (الملف المُنشأ):
public partial class AddEmailToUser : Migration{ protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Email", table: "Users", type: "nvarchar(200)", nullable: true); }
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Email", table: "Users"); }}طريقة Up تطبق التغييرات، وطريقة Down ترجعها.
مزايا وعيوب ترحيلات EF Core
- الإيجابيات: تكامل وثيق مع النماذج، إنشاء تلقائي للكود، دعم التراجع، مدمج في النظام البيئي لـ .NET.
- السلبيات: الارتباط بـ EF Core، صعوبة التعامل مع التغييرات غير التقليدية (مثل إعادة تسمية الأعمدة)، احتمالية حدوث مشاكل في التعارضات داخل الفريق.
2. FluentMigrator
هذه مكتبة مستقلة وخفيفة الوزن للترحيلات، غير مرتبطة بأي ORM محدد. تُكتب الترحيلات يدويًا بلغة C# باستخدام واجهة fluent.
التثبيت
dotnet add package FluentMigratorمثال على الترحيل
[Migration(202310010001)]public class CreateUserTable : Migration{ public override void Up() { Create.Table("Users") .WithColumn("Id").AsInt32().PrimaryKey().Identity() .WithColumn("Name").AsString(100).NotNullable() .WithColumn("Email").AsString(200).Nullable(); Create.Index("IX_Users_Email") .OnTable("Users") .OnColumn("Email"); }
public override void Down() { Delete.Table("Users"); }}تشغيل الترحيلات
لتشغيل الترحيلات، يتم استخدام runner. مثال على الإعداد في Program.cs:
var serviceProvider = new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb => rb .AddSqlServer() .WithGlobalConnectionString("YourConnectionString") .ScanIn(typeof(CreateUserTable).Assembly).For.Migrations()) .BuildServiceProvider();
using var scope = serviceProvider.CreateScope();var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();runner.MigrateUp();