通过Migration生成数据库的命令
在vs中的“程序包管理器控制台”中输入如下两个命令,也可以在项目所在文件夹中打开命令行工具进行操作
命令一共有5种,每个有两种写法:
dotnet ef migrations add initialCreate ||Add-Migrantion (执行此命令项目生成一个目录(Migrations))
dotnet ef database update ||Update-Database (把当前的Migrations更新到数据库中)
dotnet ef migrations remove ||Remove-Migration (删除一个最新的Migrations,降级,根据数据库表结构删除migrations文件夹下面多余的文件)
dotnet ef database update LastGoodMigration || Update-Database LastGoodMigration(指定一个Migrations更新 LastGoodMigration 指定的migration名称)
dotnet ef migrations script || Script-Migration (将更新内容生成sql脚本语句)
asp.net core 中实现DBContext的初始化,先创建一个ApplicationDBContextSeed,作为初始化基础数据的类,
需要引用 using Microsoft.Extensions.DependencyInjection 和 using Microsoft.Extensions.Logging ,只有在初始化创建数据库的时候将默认的admin账号写入表中
public class ApplicationDBContextSeed
{
private UserManager _userManager;
public async Task SeedAsync(ApplicationDBContext contest,IServiceProvider serviceProvider)
{
if (!contest.Users.Any())
{
_userManager = serviceProvider.GetRequiredService>();
var defultUser = new ApplicationUser
{
UserName = "admin",
Email = "leo@qq.com",
NormalizedUserName = "admin"
};
var resilt= await _userManager.CreateAsync(defultUser, "123456");
if(!resilt.Succeeded)
{
throw new Exception("初始化用户信息失败!");
}
}
}
}
创建WebHostMirgationExtensions
public static class WebHostMirgationExtensions
{
public static IWebHost MigrateDbContext(this IWebHost host,Action sedder) where TContext:DbContext
{
using (var scope =host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var logger = services.GetRequiredService>();
var context = services.GetService();
try
{
context.Database.Migrate();//每次执行都会自动去更新数据库
sedder(context, services);
logger.LogInformation($"执行DBContext:{typeof(TContext).Name} seed方法成功");
}
catch (Exception ex)
{
logger.LogError(ex, $"执行DBContext:{typeof(TContext).Name} seed方法失败");
}
}
return host;
}
}
修改Program
public static void Main(string[] args)
{
BuildWebHost(args)
.MigrateDbContext((context, server) => {
new ApplicationDBContextSeed().SeedAsync(context, server).Wait(); }
).Run();
}