在 Code First DbMigration 中更新存储过程

Update stored procedure in Code First DbMigration

我有创建存储过程的解决方案,就像这个答案 。

我是运行宁

Sql(Properties.Resources.Create_sp_DoSomething);

在我的初始 DbMigration 中。

我的 sql 脚本有代码先删除现有 SP,然后创建新的更新 SP。所以当我 运行

Sql(Properties.Resources.Create_sp_DoSomething);

在新的 DbMigration 中,SP 内部的逻辑发生了变化,一切正常。

当我想用列更新存储过程时出现问题(比如说 IsActive),这些列在以后的提交中被添加到模型中,并且我在没有现有数据库的情况下进行更新(所以创建新的数据库)。 然后失败

Invalid column name 'IsActive'.

除了删除对

的所有现有调用之外,还有什么好的解决方案

Sql(Properties.Resources.Create_sp_DoSomething);

并且只在最新的 DbMigration 中有它。

通过在所有迁移后运行的迁移 Seed() 方法中执行存储过程更新,将存储过程与模型创建分开:

context.Database.ExecuteSqlCommand(sp_DoSomething);

由于这与每个更新数据库一起运行,因此您需要通过在 Create_sp_DoSomething 的开头添加存在性检查来使脚本幂等:

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_DoSomething')
BEGIN
    DROP PROCEDURE sp_DoSomething
END