在 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
我有创建存储过程的解决方案,就像这个答案 。
我是运行宁
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