准备工作
首先,我们打开vs中的NuGet包安装以下的库:
Microsoft.EntityFrameworkCore.SqlServer(连接sql server数据库的包)
Microsoft.EntityFrameworkCore.Tools(命令行所需的库)
Microsoft.EntityFrameworkCore.Design(vs code命令行所需的库,但是我用的是vs2019,所以这个不需要安装)
如果你使用mysql,那么下面的包替换sql servcer包,其他的不变:
Pomelo.EntityFrameworkCore.MySql
或者
MySql.Data.EntityFrameworkCore(官方包)
创建模型
public class Province { public int Id { get; set; } public string Name { get; set; } public int Population { get; set; } }
创建DbContext
using Microsoft.EntityFrameworkCore;
public class MyContext : DbContext { public MyContext(DbContextOptions<MyContext> options) : base(options) {
} public DbSet<Province> Province { get; set; } }
在appsettings.json文件中写好连接字符串
{ //连接的字符串 "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=EFCOREDATABASE;Integrated Security=True", "mysqlDefaultConnection": "Server=localhost;Database=EFCOREDATABASE;uid=root;pwd=123456" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
在Startup.cs文件中的ConfigureServices方法中引用
services.AddDbContext<MyContext>(options => { options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")); //连接MySQL字符串 //options.UseMySql(Configuration.GetConnectionString("mysqlDefaultConnection")); });
打开命令面板输入命令生成数据库
我们输入get-help entityframework获取以下命令,但是我们只需要用第一个和最后一个那么就完成了我们数据库生成了
Add-Migration | 添加迁移 |
Drop-Database | 删除数据库 |
Get-DbContext | 获取DbContext |
Remove-Migration | 删除迁移 |
Scaffold-DbContext | 脚手架数据库上下文 |
Script-Migration | 脚本迁移 |
Update-Database | 更新数据库 |
生成以下的文件后,我们在update-database,那么我们的数据库就生成成功了。
看到以下内容那么就OK了。
自动迁移
控制台启动程序中添加代码(这里说明下,我把CreateWebHostBuilder()方法删了,代码全部放在Main()中了):
public class Program { public static void Main(string[] args) { IHostBuilder hostBuild = Host.CreateDefaultBuilder(args); hostBuild.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); var host = hostBuild.Build(); using (var scope = host.Services.CreateScope()) { try { var db = scope.ServiceProvider.GetRequiredService<MyContext>(); //Migrate()方法使用前需在程序包管理控制台执行Add-migration迁移命令。 //之后程序每次启动,GetPendingMigrations()都会去检测是否有待迁移内容,有的话,自动应用迁移。 if (db.Database.GetPendingMigrations().Any()) { db.Database.Migrate(); //执行迁移 } //EnsureCreated方法不需要先执行Add-migration迁移命令,如果数据库不存在,则自动创建并返回true。 //如果已经创建了数据库后,又改动了实体Model和之前的库存在冲突,要注意删库让它自动重建,否则会报错。 //db.Database.EnsureDeleted();//删除数据库 //db.Database.EnsureCreated(); } catch (Exception ex) { var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "Database Migration Error!"); throw; } } host.Run(); } }