创建数据库迁移

简介:
这一节我们说说数据库迁移(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命令更新数据库。

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




本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/4925864.html,如需转载请自行联系原作者

目录
相关文章
|
19天前
|
关系型数据库 Apache 流计算
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
本文介绍了如何将数据从 OceanBase 迁移到阿里云数据库 SelectDB 内核版 Apache Doris。提供 3 种数据同步方法 1. 使用 DataX,下载 DataX 并编写配置文件,通过 OceanBaseReader 和 DorisWriter 进行数据迁移。 2. 利用 Apache Doris 的 Catalog功 能,将 OceanBase 表映射到 Doris 并插入数据。 3. 通过Flink CDC,设置 OceanBase 环境,配置 Flink 连接器,实现实时数据同步。
手把手教你实现 OceanBase 数据到阿里云数据库 SelectDB 内核版 Apache Doris 的便捷迁移|实用指南
|
4月前
|
关系型数据库 MySQL 数据库连接
gorm连接mysql数据库以及建表和自动迁移
gorm连接mysql数据库以及建表和自动迁移
40 0
|
5月前
|
SQL 数据库 Python
记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题
Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数据库,该迁移工具不会自动创建。你可以使用SQL命令手动创建一个数据库:
49 0
|
5月前
|
关系型数据库 数据库 RDS
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
30 1
|
2天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
15 0
|
11天前
|
SQL 关系型数据库 MySQL
数据库的迁移
数据库的迁移
|
12天前
|
关系型数据库 MySQL 测试技术
【专栏】PostgreSQL数据库向MySQL迁移的过程、挑战及策略
【4月更文挑战第29天】本文探讨了PostgreSQL数据库向MySQL迁移的过程、挑战及策略。迁移步骤包括评估规划、数据导出与转换、创建MySQL数据库、数据导入。挑战包括数据类型不匹配、函数和语法差异、数据完整性和性能问题。应对策略涉及数据类型映射、代码调整、数据校验和性能优化。迁移后需进行数据验证、性能测试和业务验证,确保顺利过渡。在数字化时代,掌握数据库迁移技能对技术人员至关重要。
|
26天前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。
|
2月前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
|
3月前
|
存储 关系型数据库 数据库
在进行RDS(Amazon Relational Database Service,亚马逊关系数据库服务)迁移时,兼容性审查
在进行RDS(Amazon Relational Database Service,亚马逊关系数据库服务)迁移时,兼容性审查
23 1