准備工作
首先,我們打開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(); } }