8

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

+0

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) –

risposta

0

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.

2

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 
3

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:

  1. Creare un file sql nel progetto di abbandonare tutte le vista e funzioni e procedure che hai se fossero esiste, lo chiamano drop.sql per esempio.
  2. Creare per ogni view e function e stored procedure un file sql separato nel progetto.
  3. Seleziona tutto il file sql come Embedded Resource, da fare clic destro sul file, allora di proprietà poi costruire Azione, scegliere Embedded Resource

    YourFile.sql => click destro => Proprietà => Crea Azione, scegliere Risorsa incorporata

  4. 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