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命令更新数据库。

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

  • 相关阅读:
    Eclipse快捷键 10个最有用的快捷键
    Eclipse--Web项目中 .classpath、mymetadata、project文件的功用
    java.lang.IllegalStateException:Web app root system property already set to different value 错误原因及解决 Log4j
    验证位置时发生错误:“org.tigris.subversion.javahl.ClientException......
    隐藏控制台黑窗口
    APK伪加密
    格蠹汇编-01-blog
    static_cast、dynamic_cast、const_cast和reinterpret_cast总结
    CONTAINING_RECORD宏
    explicit关键字
  • 原文地址:https://www.cnblogs.com/farb/p/4925864.html
Copyright © 2011-2022 走看看