【发布时间】:2015-11-14 13:11:27
【问题描述】:
我们可以使用代码优先迁移运行 sql 脚本吗?
我是第一次编码的新手,如果我想在迁移的 update-database 命令之前将我的更改保存到 SQL 脚本文件,可以吗?
如果可能,请提供完成它的步骤。此外,如果生成了脚本,那么我是否可以使用迁移来运行该脚本?
【问题讨论】:
标签: c# sql-server asp.net-mvc entity-framework asp.net-mvc-4
我们可以使用代码优先迁移运行 sql 脚本吗?
我是第一次编码的新手,如果我想在迁移的 update-database 命令之前将我的更改保存到 SQL 脚本文件,可以吗?
如果可能,请提供完成它的步骤。此外,如果生成了脚本,那么我是否可以使用迁移来运行该脚本?
【问题讨论】:
标签: c# sql-server asp.net-mvc entity-framework asp.net-mvc-4
首先您需要创建一个迁移。
Add-Migration RunSqlScript
然后在生成的迁移文件中你可以编写你的 SQL。
// PLAIN SQL
Sql("UPDATE dbo.Table SET Created = GETDATE()");
// FROM FILE
var sqlFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Custom.sql");
Sql(File.ReadAllText(sqlFile));
然后你运行
Update-Database
【讨论】:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory 让我进入调试目录。
我喜欢做的是将 SQL 脚本作为资源嵌入到程序集中并使用SqlResource 方法。我已经使用 Visual Studio 2017 15.5.6 测试了这种方法。
首先你需要创建一个迁移文件:
DbContext 的项目设置为启动项目如果您同时安装了 EF 核心和 EF 6.x:
EntityFramework\Add-Migration RunSqlScript
如果您只安装了 EF 6.x:
Add-Migration RunSqlScript
在迁移文件夹中添加一个Sql Script(我用与迁移文件相同的前缀命名)
在文件属性窗口中确保构建操作是“嵌入式资源” 请注意,我们不需要复制到输出文件夹,因为 sql 脚本将嵌入到程序集中。
更新RunSqlScript迁移中的Up方法
public override void Up()
{
string sqlResName = typeof(RunSqlScript).Namespace + ".201801310940543_RunSqlScript.sql";
this.SqlResource(sqlResName );
}
希望对你有帮助
【讨论】:
.sql 嵌套在迁移文件下...这会破坏资源的嵌入。让它不嵌套。
var resourceNames = this.GetType().Assembly.GetManifestResourceNames(); var sqlResourceName = resourceNames.SingleOrDefault(r => r.Contains("201801310940543_RunSqlScript.sql"));
.sql 文件的问题。
Sql(File.ReadAllText(sqlFile)); 将生成的 Up() 和 Down() 迁移方法与一些各自的自定义 SQL MyMigrationNameUp/Down.sql 脚本相结合 - 效果很好!!
和 SQL 一样,我们还有另一个方法 SqlFile。你可以直接使用它。
【讨论】:
SqlFile("Custom.sql") 对于 .NET Core 和 EF Core,您可以在迁移中执行类似的操作
protected override void Up(MigrationBuilder migrationBuilder)
{
var schema = "starter_core";
migrationBuilder.Sql($"INSERT INTO [{schema}].[Roles] ([Name]) VALUES ('transporter')");
}
【讨论】: