創建數據庫遷移


返回總目錄《一步一步使用ABP框架搭建正式項目系列教程》


這一節我們說說數據庫遷移(Migration)。

我們之前用的DBFirst創建了實體類,但當初這么做的原因是為了節省時間。現在我們通過創建的實體類和DbContext類利用EF的Code First數據庫遷移反過來創建數據庫。ABP模板默認開啟了遷移,並且添加了一下下面的Configuration類:

namespace Noah.ChargeStation.Migrations
{
    internal sealed class Configuration : DbMigrationsConfiguration<ChargeStation.EntityFramework.ChargeStationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "ChargeStation";
        }
        /// <summary>
        /// 添加種子數據,比如默認管理員等數據
        /// </summary>
        /// <param name="context">當前數據庫上下文子類</param>
        protected override void Seed(ChargeStation.EntityFramework.ChargeStationDbContext context)
        {
            context.DisableAllFilters();
            new InitialDataBuilder(context).Build();
        }
    }
}
namespace Noah.ChargeStation.Migrations.SeedData
{
    public class DefaultTenantRoleAndUserBuilder
    {
        private readonly ChargeStationDbContext _context;

        public DefaultTenantRoleAndUserBuilder(ChargeStationDbContext context)
        {
            _context = context;
        }

        public void Build()
        {
            CreateUserAndRoles();
        }

        private void CreateUserAndRoles()
        {
            //Admin role for tenancy owner

            var adminRoleForTenancyOwner = _context.Roles.FirstOrDefault(r => r.TenantId == null && r.Name == "Admin");
            if (adminRoleForTenancyOwner == null)
            {
                adminRoleForTenancyOwner = _context.Roles.Add(new Role { Name = "Admin", DisplayName = "Admin", IsStatic = true });
                _context.SaveChanges();
            }

            //Admin user for tenancy owner

            var adminUserForTenancyOwner = _context.Users.FirstOrDefault(u => u.TenantId == null && u.UserName == "admin");
            if (adminUserForTenancyOwner == null)
            {
                adminUserForTenancyOwner = _context.Users.Add(
                    new User
                    {
                        TenantId = null,
                        UserName = "admin",
                        Name = "System",
                        Surname = "Administrator",
                        EmailAddress = "admin@aspnetboilerplate.com",
                        IsEmailConfirmed = true,
                        Password = "AM4OLBpptxBYmM79lGOX9egzZk3vIQU3d/gFCJzaBjAPXzYIK3tQ2N7X4fcrHtElTw==" //123qwe
                    });

                _context.SaveChanges();

                _context.UserRoles.Add(new UserRole(adminUserForTenancyOwner.Id, adminRoleForTenancyOwner.Id));

                _context.SaveChanges();
            }

            //Default tenant

            var defaultTenant = _context.Tenants.FirstOrDefault(t => t.TenancyName == "Default");
            if (defaultTenant == null)
            {
                defaultTenant = _context.Tenants.Add(new Tenant { TenancyName = "Default", Name = "Default" });
                _context.SaveChanges();
            }

            //Admin role for 'Default' tenant

            var adminRoleForDefaultTenant = _context.Roles.FirstOrDefault(r => r.TenantId == defaultTenant.Id && r.Name == "Admin");
            if (adminRoleForDefaultTenant == null)
            {
                adminRoleForDefaultTenant = _context.Roles.Add(new Role { TenantId = defaultTenant.Id, Name = "Admin", DisplayName = "Admin", IsStatic = true });
                _context.SaveChanges();
            }

            //Admin for 'Default' tenant

            var adminUserForDefaultTenant = _context.Users.FirstOrDefault(u => u.TenantId == defaultTenant.Id && u.UserName == "admin");
            if (adminUserForDefaultTenant == null)
            {
                adminUserForDefaultTenant = _context.Users.Add(
                    new User
                    {
                        TenantId = defaultTenant.Id,
                        UserName = "admin",
                        Name = "System",
                        Surname = "Administrator",
                        EmailAddress = "admin@aspnetboilerplate.com",
                        IsEmailConfirmed = true,
                        Password = "AM4OLBpptxBYmM79lGOX9egzZk3vIQU3d/gFCJzaBjAPXzYIK3tQ2N7X4fcrHtElTw==" //123qwe
                    });
                _context.SaveChanges();

                _context.UserRoles.Add(new UserRole(adminUserForDefaultTenant.Id, adminRoleForDefaultTenant.Id));
                _context.SaveChanges();
            }
        }
    }
}

在Seed方法中,添加了租戶,角色和用戶數據。現在,我來創建初始化遷移。打開包管理器控制台,輸入下面的命令:

image

此處特別注意,紅色方框中一定不要忘了選擇EF項目,否則不會有下面出現的命令“Add-Migration”,”InitialData”是生成文件的后綴名(也是文件中類的名字),也可以取其他名字。

image

image

可以看到生成的文件一個以cs結尾,這里面的代碼是創建數據庫中表的,另一個以Designer.cs結尾,記錄的是數據庫遷移的版本記錄,最后一個以.resx文件是資源文件,暫且不需要考慮。

剛才我們只是創建了創建數據庫所需要的類,但還沒有創建數據庫。為了創建數據庫,需要在包管理控制台執行以下命令:

PM> Update-Database
 

該命令完成了這次數據庫的遷移,創建了數據庫並填充了種子數據。

image

當我們改變實體類時,可以使用Add-Migration命令創建新的遷移類和Update-Database命令更新數據庫。

至此,數據庫遷移完成。下一次我們說說《定義倉儲》。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM