我们可以使用代码优先迁移来运行sql脚本吗?
我是新手代码,如果我想在迁移的update-database命令之前将更改保存到SQL脚本文件,是否可以?
如果可能,请提供完成工作的步骤。此外,如果生成脚本,那么我是否可以使用迁移运行该脚本?
答案 0 :(得分:62)
首先,您需要创建迁移。
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
答案 1 :(得分:22)
我喜欢将SQL脚本作为资源嵌入到程序集中并使用SqlResource
方法。我已经使用Visual Studio 2017 15.5.6测试了这种方法。
首先,您需要创建一个迁移文件:
DbContext
的项目设置为启动项目如果您同时安装了EF内核和EF 6.x:
EntityFramework\Add-Migration RunSqlScript
如果您只安装了EF 6.x:
Add-Migration RunSqlScript
在迁移文件夹中添加Sql脚本(我使用与迁移文件相同的前缀命名)
在文件属性窗口中,确保构建操作是"嵌入式资源" 请注意,我们不需要复制到输出文件夹,因为sql脚本将嵌入到程序集中。
更新RunSqlScript
迁移
public override void Up()
{
string sqlResName = typeof(RunSqlScript).Namespace + ".201801310940543_RunSqlScript.sql";
this.SqlResource(sqlResName );
}
我希望这会有所帮助
答案 2 :(得分:7)
与SQL一样,我们有另一种方法SqlFile。你可以直接使用它。
答案 3 :(得分:0)
对于.NET Core和EF Core,您可以在迁移中执行类似的操作
protected override void Up(MigrationBuilder migrationBuilder)
{
var schema = "starter_core";
migrationBuilder.Sql($"INSERT INTO [{schema}].[Roles] ([Name]) VALUES ('transporter')");
}