建立数据库迁移

返回总目录《一步一步使用ABP框架搭建正式项目系列教程》html


这一节咱们说说数据库迁移(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”是生成文件的后缀名(也是文件中类的名字),也能够取其余名字。ide

image

image

能够看到生成的文件一个以cs结尾,这里面的代码是建立数据库中表的,另外一个以Designer.cs结尾,记录的是数据库迁移的版本记录,最后一个以.resx文件是资源文件,暂且不须要考虑。ui

刚才咱们只是建立了建立数据库所须要的类,但尚未建立数据库。为了建立数据库,须要在包管理控制台执行如下命令:spa

PM> Update-Database
 

该命令完成了此次数据库的迁移,建立了数据库并填充了种子数据。3d

image

当咱们改变实体类时,可使用Add-Migration命令建立新的迁移类和Update-Database命令更新数据库。code

至此,数据库迁移完成。下一次咱们说说《定义仓储》。htm

相关文章
相关标签/搜索