问题
I am using Entity Framework Code First in my current project. A Database consists of many tables, many views, and many functions. I am able to create tables using Entity Framework Code First. But I am unable to find a way to create stored procedures using Entity Framework Code First. I know Database-First strategy will fulfill my requirement and everything works well, but I don’t want to use Database-First strategy into my existing project code.
Please help me someone, what are the best ways to create stored procedures using Entity Framework Code First strategy?
回答1:
Instead of using StringBuilder you can use existing EF methods
public override void Up()
{
CreateStoredProcedure(
"MyStoredProcedure",
p => new
{
id = p.Int()
},
@"SELECT some-data FROM my-table WHERE id = @id"
);
}
public override void Down()
{
DropStoredProcedure("MyStoredProcedure");
}
回答2:
With Code First, you always make Migrations. Migrations inherits from DbMigration object, which has a very usefull method:
DbMigration.Sql(string)
Here are the steps:
1) Open the Package Manager Console from NuGet Package Manager
2) Type add-migration CreateHelloWorldStoredProcedureExample
3) The Visual Studio would show you a new class with two empty methods: Up and Down
4) In Up method, write your code, here is an example
public override void Up()
{
StringBuilder storedProcedureCode = new StringBuilder();
storedProcedureCode.Append("CREATE PROCEDURE dbo.HelloWorld" + Environment.NewLine);
storedProcedureCode.Append("AS" + Environment.NewLine);
storedProcedureCode.Append("BEGIN" + Environment.NewLine);
storedProcedureCode.Append(@"SELECT 'Hello World'" + Environment.NewLine);
storedProcedureCode.Append("END" + Environment.NewLine);
this.Sql(storedProcedureCode.ToString());
}
While in Down method:
public override void Down()
{
this.Sql("DROP PROCEDURE dbo.HelloWorld ");
}
After this, just run update-database and thats it!
Note: In case you use SQL Server, avoid the use of GO sentence.
回答3:
If you are using EF Core 2.1, you can create stored procedure in such way:
public partial class AddStoredProcedure : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"your create procedure statement");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"your drop procedure statement");
}
}
来源:https://stackoverflow.com/questions/20715292/create-stored-procedures-using-entity-framework-code-first