Sto creando un'app MVC 5 con un approccio Code-First, ma ho anche creato alcune stored procedure nel database di SQL Server, c'è un modo per generare anche queste stored procedure in C# quando viene creato il database, magari eseguendo uno script sql, in caso affermativo dove dovrei farlo?EF 6 code-first con stored procedure personalizzata
risposta
Probabilmente sarà necessario utilizzare Migrazioni per gestirlo. Una soluzione di bell'aspetto può essere trovata https://stackoverflow.com/a/15171900/119262. usando le risorse ma sono sicuro che potresti leggere il testo dai tuoi file .sql nello stesso modo se non vuoi andare lungo il percorso della risorsa.
Vorrei utilizzare le migrazioni di codice.
Dal vostro manager Nuget Package è possibile impostare una migrazione vuota digitando
add-migration AddMyStoredProcedure
Questo dovrebbe generare una classe vuota in questo modo
public partial class AddMyStoredProcedure : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
Tutto quello che dovete fare è aggiungere la stored procedure in questo modo (ricordarsi di abbandonare la procedura memorizzata nel metodo Giù nel caso in cui sia necessario ripristinare la migrazione in futuro).
public partial class AddMyStoredProcedure : DbMigration
{
public override void Up()
{
Sql(@"
CREATE PROCEDURE dbo.GetMyAddress
AS
SELECT * FROM Person.Address");
}
public override void Down()
{
Sql("DROP PROCEDURE dbo.GetMyAddress");
}
}
infine aggiornare il database
update-database
risposta tardi, ma forse qualcuno otterrà una risposta per questa domanda
ho avuto un sacco di views
e functions
e stored procedures
per affrontare nel mio progetto e la soluzione che ho usato era la seguente:
- Creare un file
sql
nel progetto di abbandonare tutte le vista e funzioni e procedure che hai se fossero esiste, lo chiamanodrop.sql
per esempio. - Creare per ogni
view
efunction
estored procedure
un filesql
separato nel progetto. - Seleziona tutto il file sql come
Embedded Resource
, da fare clic destro sul file, allora di proprietà poi costruire Azione, scegliereEmbedded Resource
YourFile.sql => click destro => Proprietà => Crea Azione, scegliere Risorsa incorporata
- Nella funzione seme di migrazione, utilizzare lo
ExecuteSqlCommand
, è necessario un metodo che consenta di leggere questi file e sotto tutto il codice richiesto.
struttura DROP.SQL
-- your views
if object_id('dbo.[YourViewName1]') is not null
drop view dbo.[YourViewName1]
if object_id('dbo.[YourViewName2]') is not null
drop view dbo.[YourViewName2]
-- your functions
if object_id('dbo.[Function1]') is not null
drop function dbo.[Function1]
if object_id('dbo.[Function2]') is not null
drop function dbo.[Function2]
-- your procedures
if object_id('dbo.[Procedure1]') is not null
drop procedure dbo.[Procedure1]
if object_id('dbo.[Procedure2]') is not null
drop procedure dbo.[Procedure2]
view.sql o function.sql o procedura.Struttura sql
create view View1
as
select Field1,Field2,...Fieldn
from Table1
inner join Table2 on Id1 = FId2
inner join TableN on IdI = IdJ
metodo di semi di migrazione
ho pensato che si è creato tutti i file SQL all'interno Sql cartella all'interno Migrazioni cartella nel progetto
protected override void Seed(YourContext context)
{
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.drop.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.view1.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.view2.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.function1.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.function2.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.procedure1.sql"));
context.Database
.ExecuteSqlCommand(Load("YourProject.Migrations.Sql.procedure2.sql"));
}
Infine il metodo Load
private static string Load(string name)
{
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(name))
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
return result;
}
}
Il vantaggio di questa soluzione è che verrà eseguito ogni volta, e si fare in modo che se ci fosse qualche problema (per esempio, dopo un po 'è stata modificata un nome di campo o hai rimosso una tabella che è stata utilizzata all'interno di una vista o la funzione o la procedura senza ricordare che devi aggiornare le tue procedure, riceverai un errore e puoi correggere se hai abilitato le migrazioni automatiche).
Spero che questo vi aiuterà a
Eventuali duplicati di [Esecuzione in uno script SQL memorizzato come una risorsa] (https://stackoverflow.com/questions/1379195/executing-a-sql-script-stored- as-a-risorsa) –