如何不访问数据库获取EF Core的Database.EnsureCreated生成的建表SQL
EF Core 无数据库请求生成建表SQL方案
方案1:EF Core 5+ 内置方法(推荐)
EF Core 5及以上版本已经内置了无需访问数据库即可生成建表脚本的API,直接调用即可:
- 首先确保项目已安装对应数据库的EF Core Provider(如SQL Server对应
Microsoft.EntityFrameworkCore.SqlServer,MySQL对应Pomelo.EntityFrameworkCore.MySql) - 无需填写有效数据库连接字符串,仅需指定数据库类型,调用
GenerateCreateScript()方法即可得到完整建表SQL
示例代码:
var options = new DbContextOptionsBuilder<ApplicationDbContext>() // 指定你使用的数据库类型,不需要填写有效连接字符串 .UseSqlServer() .Options; using var dbContext = new ApplicationDbContext(options); // 直接生成SQL,全程不会发起任何数据库请求 string createSql = dbContext.Database.GenerateCreateScript();
方案2:低版本EF Core 手动调用设计时API
如果使用EF Core 5以下版本,可以通过EF Core内置的设计时服务生成脚本:
- 先安装
Microsoft.EntityFrameworkCore.Design包 - 调用模型差异比对、SQL生成服务得到脚本
示例代码:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage; var options = new DbContextOptionsBuilder<ApplicationDbContext>() .UseSqlServer() .Options; using var dbContext = new ApplicationDbContext(options); var modelDiffer = dbContext.GetService<IMigrationsModelDiffer>(); var sqlGenerator = dbContext.GetService<IMigrationsSqlGenerator>(); // 比对空模型和当前业务模型的差异得到建表操作 var operations = modelDiffer.GetDifferences(null, dbContext.Model.GetRelationalModel()); // 生成SQL命令 var commands = sqlGenerator.Generate(operations, dbContext.Model); // 拼接得到完整SQL string createSql = string.Join(Environment.NewLine, commands.Select(c => c.CommandText));
输出说明
以上两种方案生成的SQL和Database.EnsureCreated()实际执行的SQL完全一致,以你的示例代码为例,生成的SQL为(如果需要表名和实体名一致,给Dto类加[Table("Dto")]注解即可):
CREATE TABLE [Dtos] ( [ID] nvarchar(10) NOT NULL, [Name] nvarchar(100) NOT NULL, [Age] int NOT NULL, CONSTRAINT [PK_Dtos] PRIMARY KEY ([ID]) );
内容的提问来源于stack exchange,提问作者Wei Lin
相关产品推荐
相关产品推荐

