مهاجرت دیتابیس در Code First توسط Fluent Migrator

سه شنبه 3 شهریور 1394

Fluent Migrator مهاجرت دیتابیس در Code First را بسیار آسان می کند. این یک فریم ورک مهاجرت دیتابیس برای NET. می باشد و از یک fluent interface (رابط مسلط) برای تغییرات در بانک اطلاعاتی استفاده می نماید.

مهاجرت دیتابیس در Code First توسط Fluent Migrator

مقدمه

هنگام ساخت یک برنامه، ما بانک اطلاعاتی خود را به صورت دستی مدیریت می کنیم به عنوان مثال ما در SQL اسکریپت هایی (برای ساخت و بروزرسانی جداول، Stored Procedure ها و توابع و غیره) می سازیم و سپس آنها را اجرا می کنیم. همچنین ما نیاز به مدیریت آنها با یک نظم خاص برای اجرای آنها در یک محیط یکپارچه داریم. بنابراین مدیریت این تغییرات پایگاه داده به طور منظم با توسعه و استقرار یک کار دشوار است.

 

حالا خبر خوب در اینجا برای حل همه این مشکلات Fluent Migrator می باشد.

 

Fluent Migrator چیست؟

این یک فریم ورک مهاجرت دیتابیس برای NET. می باشد و از یک fluent interface (رابط مسلط) برای تغییرات در بانک اطلاعاتی استفاده می نماید.

برای استفاده از Fluent Migrator ما شکل تغییرات را در کلاس هایی که دارای 2 متد با نام های ()Up و ()Down می باشد، تعریف می کنیم. همانطور که از نام آنها پیداست متد Up برای ارتقاء (Upgrade) پایگاه داده و متد Down برای DownGrade پایگاه داده استفاده می شود. این کلاسها را می توان به یک سیستم کنترل نسخه (Version Control System) سپرد.

 

Fluent Migrator چگونه کار می کند؟

کلاس های مهاجرت کلاس های ساده سی شارپ هستند که از کلاس پایه "Migration" ارث بری می کنند. شما نیاز به قرار دادن یک کد شناسایی منحصر به فرد در صفت های Migration در هر کلاس که خود برای یک نسخه از مهاجرت است دارید. این شناسه می تواند به صورت افزایشی بوده و یا ما می توانیم از یک فرمت YYYYMMDDHHMM برای آن استفاده کنیم.

 

سپس ما متدهای Up و Down را پیاده سازی می کنیم. برای مثال در متد Up ما می توانیم جدول جدیدی ساخته و در Down آن جدول را پاک کنیم. همه کلاس های مهاجرت در یک اسمبلی نگهداری می شوند.

 

Fluent Migrator یک ابزار برای مهاجرت با نام Migration Runner tool (Migrate.exe که متدهای Up یا Down را از کلاس های مهاجرت به درستی اجرا می کند. ما می توانیم این ابزار را در هر ابزار CI (ادغام مداوم = Continuous Integration)مانند Jenkins،TFS برای خودکار کردن پروسه مهاجرت ادغام نماییم.

 

Fluent Migrator همچنین شامل جدول “Version” در پایگاه داده می باشد که این برای  پیگیری نسخه مهاجرت

اجراشده می باشد.

 

پیاده سازی Fluent Migrator

 

پیاده سازی Fluent Migrator کار ساده ای است. ابتدا پروژه خود در Visual Studio را باز نموده و یک “Class Library” به آن اضافه نمایید. می توانید آن را “DatabaseMigration” نامگذاری نمایید.

پکیج NuGet برای Fluent Migrator در پروژه “DatabaseMigration” را نصب می کنیم. برای این کار از دستور زیر استفاده می کنیم.

Install-Package FluentMigrator

این دستور آخرین پکیج از Fluent Migrator و رفرنس های آن را به برنامه شما اضافه می نماید.

 

upgrade پایگاه داده توسط کلاس های مهاجرت

یک پوشه جدید با نام Migrations در پروژه “DatabaseMigration” برای نگهداری تمامی کلاس های مهاجرت می سازیم.

درون این فولدر یک کلاس با نام “M0001_CreateMemberTable.cs” ساخته و کدهای زیر را در آن کپی نمایید.

using FluentMigrator;
namespace DatabaseMigration.Migrations
{
    [Migration(1)]
    public class M0001_CreateMemberTable:Migration
    {
        public override void Up()
        {
            Create.Table("Member")
                .WithColumn("MemberId").AsInt32().PrimaryKey().Identity()
                .WithColumn("Name").AsString(50)
                .WithColumn("Address").AsString()
                .WithColumn("MobileNo").AsString(10);
        }

        public override void Down()
        {
            Delete.Table("Member");
        }
    }
}

 

در اینجا ما یک کلاس مشتق شده از کلاس Migration با شماره نسخه 1 با پیاده سازی متدهای Up و Down می سازیم. ما می توانیم هر دستور Sql داشته باشیم اما Fluent Migrator راه دیگری که توسط دستورهای API که Fluent API commands می باشند مانند Create, Delete, Rename, Insert, Update, Execute و غیره فراهم کرده است.

در متد Up ما یک جدول “Member” با تعدادی ستون داریم و در متد Down ما جدول “Member” را حذف می کنیم.

حالا پروژه را کامپایل کرده و آماده مهاجرت هستیم. برای اجرای مهاجرت فایل “Migrate.exe” در مسیر “packages\FluentMigrator.1.6.0\tools” را داریم.

 

کد زیر را در Cmd برای اجرای مهاجرت اجرا کنید. :
 

Migrate.exe /connection "data source=localhost;initial catalog=MyTemp;
User ID=sa;Password=******;" 
/db SQLserver2008 /timeout 600 /target ..\DatabaseMigration\bin\Debug\DatabaseMigration.dll

 

در اینجا ما رشته اتصال به پایگاه داده، سرور پایگاه داده را پاس می دهیم.

به دلیل سادگی یک فایل batch با نام “MigrateDatabase.bat” در پوشه “Utils” ساخته  و دستورهای بالا را در آن قرار می دهیم. وقتی که این فایل را اجرا کردیم خروجی مانند شکل زیر می باشد.

 

 

خروجی بالا نسخه جدول تولید شده ای که در اولین مهاجرت استفاده کردیم بود و سپس مهاجرت “M0001_CreateMemberTable” به خوبی اجرا می شود. می توانید پایگاه داده را چک کرده و این دو جدول را پیدا خواهید کرد.

 

 

 

جدول Version را چک نمایید. شما یک رکورد با شماره مهاجرت Version و date-time به عنوان AppliedOn و نام مهاجرت ستون Description پیدا خواهید کرد.

 

آپگرید پایگاه داده توسط اسکریپت SQL

حال اجرای اسکریپت SQL توسط کلاس Migration را بررسی خواهیم کرد. بنابراین یک پوشه در پروژه خود با نام Scripts ساخته و اسکریپت ها را در آن قرار دهید.

 

فراموش نکنید که پروپرتی Build Action را روی Embedded Resource قرار دهید.

 

 

سپس یک کلاس مهاجرت دیگر با نام “M0002_CreateSP_GetAllMember.cs” ساخته و کدهای زیر را در آن قرار می دهیم.

 

using FluentMigrator;
namespace DatabaseMigration.Migrations
{
    [Migration(2)]
    public class M0002_CreateSP_GetAllMember : Migration
    {
        public override void Up()
        {
            Execute.EmbeddedScript("CreateSP_GetAllMember.sql");
        }

        public override void Down()
        {
            Execute.EmbeddedScript("DropSP_GetAllMember.sql");
        }
    }
}

 

در کدهای بالا ما به شادگی توسط تابع Execute.EmbeddedScript اسکریپتهای SQL خود را اجرا می کنیم.

حالا فایل Batch با نام “MigrateDatabase.bat” را دوباره اجرا کرده و شما Stored Procedure های ساخته شده را خواهید دید. جدول Version دارای 2 رکورد می باشد.

 

 

عقبگرد به پایگاه داده خود به هر نسخه خاص کا بسیار ساده ای می باشد. لازم است تا شما فرمان زیر را اجرا نمایید.

 

Migrate.exe /connection "data source=localhost;initial catalog=MyTemp;User ID=sa;Password=******;" 
/db SQLserver2008 /timeout 600 /task rollback --steps=1 /target ..\
DatabaseMigration\bin\Debug\DatabaseMigration.dll


در اینجا ما از /task با گزینه --steps و انتخاب شماره Version استفاده می کنیم. بنابراین پایگاه داده ما به نسخه 1 توسط متد Down عقبگرد می کند.

 

دوباره یک فایل Batch با نام “MigrateDatabase-RollbackToVersion-1.bat” در پوشه Utils می سازیم. خروجی زیر تولید می شود.

 

 

خروجی نمایش می دهد که مهاجرت “M0002_CreateSP_GetAllMember” با موفقیت تبدیل شده است.

با چک کردن جدول Version خواهید دید که رکورد دوم از جدول Version پاک شده است.

 

 

نتیجه گیری

پس با این روش شما می توانید توسط Fluent Migrator به سادگی پایگاه داده خود را آپگرید و دانگرید نمایید. همچنین شما می توانید پروسه مهاجرت پایگاه داده خود را به سادگی به صورت خودکار درآورید.

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید