zoukankan      html  css  js  c++  java
  • 创建数据库迁移

    返回总目录《一步一步使用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命令更新数据库。

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

  • 相关阅读:
    [Ljava.lang.String; cannot be cast to java.lang.String 报错的原因
    ajaxfileupload多文件上传
    如何设置 html 中 select 标签不可编辑、只读
    docker
    nvm use 指定版本后无效 win7
    win7禁用Adnimistrator账号登录
    win10安装tomcat9
    webstorm命令行无法使用node-gyp进行编译
    tomcat7.0安装笔记
    win10 java1.7安装笔记
  • 原文地址:https://www.cnblogs.com/farb/p/4925864.html
Copyright © 2011-2022 走看看