创建数据库迁移
这一节我们说说数据库迁移(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方法中,添加了租户,角色和用户数据。现在,我来创建初始化迁移。打开包管理器控制台,输入下面的命令:
此处特别注意,红色方框中一定不要忘了选择EF项目,否则不会有下面出现的命令“Add-Migration”,”InitialData”是生成文件的后缀名(也是文件中类的名字),也可以取其他名字。
可以看到生成的文件一个以cs结尾,这里面的代码是创建数据库中表的,另一个以Designer.cs结尾,记录的是数据库迁移的版本记录,最后一个以.resx文件是资源文件,暂且不需要考虑。
刚才我们只是创建了创建数据库所需要的类,但还没有创建数据库。为了创建数据库,需要在包管理控制台执行以下命令:
PM> Update-Database
该命令完成了这次数据库的迁移,创建了数据库并填充了种子数据。
当我们改变实体类时,可以使用Add-Migration命令创建新的迁移类和Update-Database命令更新数据库。
至此,数据库迁移完成。下一次我们说说《定义仓储》。
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者:tkb至简
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
已将所有赞助者统一放到单独页面!签名处只保留最近10条赞助记录!查看赞助者列表
衷心感谢打赏者的厚爱与支持!也感谢点赞和评论的园友的支持! | |||
---|---|---|---|
打赏者 | 打赏金额 | 打赏日期 | |
微信:匿名 | 10.00 | 2017-08-03 | |
微信:匿名 | 10.00 | 2017-08-04 | |
微信:匿名 | 5.00 | 2017-06-15 | |
支付宝:一个名字499***@qq.com | 5.00 | 2017-06-14 | |
微信:匿名 | 16.00 | 2017-04-08 | |
支付宝:向京刘 | 10.00 | 2017-04-13 | |
微信:匿名 | 10.00 | 2017-003-08 | |
微信:匿名 | 5.00 | 2017-03-08 | |
支付宝:lll20001155 | 5.00 | 2017-03-03 | |
支付宝:她是一个弱女子 | 5.00 | 2017-03-02 |