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:
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. view
et function
et stored procedure
un file sql
distinct dans votre projet. 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
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.