你的位置:首页 > ASP.net教程

[ASP.net教程]创建数据库迁移


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

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