我的存储过程创建解决方案与此答案https://stackoverflow.com/a/15171900完全相同。
我正在运行
Sql(Properties.Resources.Create_sp_DoSomething);
在我的初始DbMigration中。
我的sql脚本有代码首先删除现有SP,然后创建新的更新SP。所以我跑了
Sql(Properties.Resources.Create_sp_DoSomething);
在新的DbMigration中,SP内部的逻辑改变了一切正常。
当我想要使用在以后提交中添加到模型中的列(例如 IsActive )更新存储过程时出现问题,并且我在没有现有数据库的情况下进行更新(因此创建了新数据库) 。 然后它失败了
无效的列名称'IsActive'。
除了删除对
的所有现有调用之外的任何其他解决方案SQL(Properties.Resources.Create_sp_DoSomething);
并且只在最新的DbMigration中使用。
答案 0 :(得分:4)
通过在所有迁移后运行的迁移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