EF-code-first avec procédure stockée personnalisée

Je crée une application MVC 5 avec une approche Code-First, mais j'ai également créé des procédures stockées sur la database SQL Server, est-il possible de générer ces procédures stockées dans c # lors de la création de la database? script SQL, si oui, où dois-je faire cela?

J'utiliserais les migrations de code.

À partir de votre gestionnaire de packages Nuget, vous pouvez configurer une migration vide en tapant

add-migration AddMyStoredProcedure 

Cela devrait générer une class vide comme ça

 public partial class AddMyStoredProcedure : DbMigration { public override void Up() { } public override void Down() { } } 

Tout ce que vous avez à faire est d'append votre procédure stockée comme ça (n'oubliez pas de laisser tomber la procédure stockée dans la méthode Down au cas où vous auriez besoin d'annuler la migration dans le futur).

  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"); } } 

Enfin mettre à jour votre database

 update-database 

Réponse tardive, mais peut-être que quelqu'un aura une réponse à cette question

J'avais beaucoup de views et de functions et de stored procedures à traiter dans mon projet, et la solution que j'ai utilisée était la suivante:

  1. Créez un file sql dans votre projet pour supprimer toutes les vues et fonctions et procédures que vous avez si elles existaient, appelez-le drop.sql par exemple.
  2. Créez pour chaque view et function et stored procedure un file sql distinct dans votre projet.
  3. Marquez tout le file sql en tant que Embedded Resource , en faisant un clic droit sur le file puis la propriété puis en créant une action, choisissez Embedded Resource

    YourFile.sql => clic droit => Properties => Build Action, choisissez Embedded Resource

  4. Dans la fonction de graine de migration, utilisez la command ExecuteSqlCommand , vous avez besoin d'une méthode pour vous permettre de lire ces files et en dessous de tout le code requirejs.

structure 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] 

structure view.sql ou function.sql ou procedure.sql

 create view View1 as select Field1,Field2,...Fieldn from Table1 inner join Table2 on Id1 = FId2 inner join TableN on IdI = IdJ 

Méthode de la graine de migration

Je suppose que vous avez créé tous les files sql à l'intérieur du dossier Sql dans le dossier Migrations de votre projet

 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")); } 

Enfin la méthode Load

 private static ssortingng Load(ssortingng name) { var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(name)) using (StreamReader reader = new StreamReader(stream)) { ssortingng result = reader.ReadToEnd(); return result; } } 

L'avantage de cette solution est qu'elle s'exécute à chaque fois, et vous vous assurerez qu'en cas de problème (par exemple, après un certain time vous avez changé un nom de champ ou vous avez supprimé une table utilisée dans une vue ou une fonction ou une procédure sans vous callbacker que vous devez mettre à jour vos procédures, vous obtiendrez une erreur et vous pourrez corriger si vous avez activé les migrations automatiques).

J'espère que ceci vous aidera

Vous devrez probablement utiliser Migrations pour le gérer. Une bonne solution peut être trouvée https://stackoverflow.com/a/15171900/119262 . en utilisant des ressources mais je suis sûr que vous pourriez simplement lire le text de vos files .sql de la même manière si vous ne voulez pas descendre le path des ressources.