【问题标题】:EF Core Database.EnsureCreated get creating table SQL and without sending request to databaseEF Core Database.EnsureCreated 获取创建表 SQL 并且不向数据库发送请求
【发布时间】:2021-12-11 10:20:27
【问题描述】:

我使用 EF Core - Database.EnsureCreated 通过 C# 类创建表,但现在我只想创建表和列 SQL,而不向数据库发送请求。

例如

public class ApplicationDbContext : DbContext
{
    public DbSet<Dto> Dtos{ get; set; }
}

public class Dto
{
  [Key]
  [StringLength(10)]
    public string ID{ get; set; }
  [StringLength(100)]
  [Required]
    public string Name{ get; set; }
  [Required]
  public int Age{ get; set; }
}

db.Database.EnsureDeleted();

预期结果:

create table Dto
{
  ID nvarchar(10) primary key not null,
  Name nvarchar(100) not null,
  Age int not null
}

我尝试了什么?

我确实打开了 SSMS 配置文件并从 EF Core 获取 SQL,但它需要向数据库发送请求。

【问题讨论】:

  • 您需要通过扩展方法db.Database.GenerateCreateScript()调用IRelationalDatabaseCreator.GenerateCreateScript()。 (github.com/dotnet/efcore/blob/…)
  • @JeremyLakeman 谢谢,您的回答完美解决了问题!你能在下面回答吗?我会把它标记为答案。

标签: c# entity-framework-core entity-framework-migrations


【解决方案1】:

我对这类问题的常用方法是在source code 中四处寻找。我找到了.EnsureCreated() 的实现,然后注意到在同一类型上有一个.GenerateCreateScript() 的公共方法。在整个代码库中搜索对该方法的调用会发现DatabaseFacade 上的扩展方法。所以你需要做的就是;

var sqlSource = db.Database.GenerateCreateScript();

但是使用谷歌搜索该方法并没有在官方文档中显示任何结果。创建生产数据库的“正确”方法是创建迁移,然后创建一个 sql 脚本来应用它们。

【讨论】:

    【解决方案2】:

    您可以使用 dotnet EF CLI 运行迁移脚本:

    dotnet ef migrations script -i -o "C:\MYFOLDER\dbscript.sql"
    

    参考号:https://docs.microsoft.com/en-us/ef/core/cli/dotnet

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多