You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不访问数据库获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:18:01