1

Ich habe Lösung für Stored Procedures Erstellung genau wie in dieser Antwort https://stackoverflow.com/a/15171900.Gespeicherte Prozedur in Code zuerst aktualisieren DbMigration

Ich betreibe

Sql(Properties.Resources.Create_sp_DoSomething); 

in meiner Anfangs DbMigration.

Meine SQL-Skripte haben Code, um zuerst den vorhandenen SP zu löschen und dann einen neuen aktualisierten SP zu erstellen. Also, wenn ich renne

Sql(Properties.Resources.Create_sp_DoSomething); 

in neue DbMigration, und Logik in SP ist alles funktioniert gut.

Das Problem entsteht, wenn ich mit Spalten Prozedur aktualisieren möchten Stored (sagen IsActive lässt), die später in wurden zu modellieren verpflichtet, und ich bin Aktualisierung ohne DB bestehenden (so neue DB erstellt wird). Dann schlägt es mit

Ungültiger Spaltenname 'IsActive'.

Jede gute Lösung für dieses andere als alle bestehenden Anrufe

Entfernen

Sql (Properties.Resources.Create_sp_DoSomething);

und haben es nur in der neuesten DbMigration.

Antwort

4

Separate Ihre gespeicherten Prozeduren von Ihrem Modellerstellung, indem Sie Ihre gespeicherte Prozedur Updates in der Migration Seed() -Methode zu tun, die nach allen Migrationen läuft:

context.Database.ExecuteSqlCommand(sp_DoSomething); 

Da dies bei jedem Update-Datenbank ausgeführt wird, werden Sie müssen, um das Skript zu machen idempotent durch eine existance Scheck an den Beginn der Create_sp_DoSomething Zugabe:

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

Wenn Sie machen dieses Skript idempotent (die benötigt wird) Sie * GO * Anweisungen zwischen Tropfen hinzufügen müssen und SP erstellen und diese Ansatz mit * ExecuteSqlComma nd() * benötigt etwas wie https://shmehralam.wordpress.com/2009/05/12/c-executing-batch-t-sql-scripts-with-go-statements/ –