Bla*_*ise 5 c# asp.net-mvc entity-framework code-first ef-migrations
是否可以使用Code First
在sql server中创建数据库函数?
喜欢
CREATE FUNCTION [dbo].[fnIsPaid] ...
Run Code Online (Sandbox Code Playgroud)
以下是我根据ChrFin的建议进行研究的方法.我把它标记为答案.但是,让我在这里保留更详细的记录.
在Package Manager Console,
Add-Migration AddFnIsPaid`中.
这将创建一个DbMigration
以时间戳为前缀的类.
在这个迁移类中,我有一个创建脚本和drop脚本Up()
和Down()
方法:
public partial class AddFnIsPaid : DbMigration
{
public override void Up()
{
Sql(_createFunctionScript);
}
public override void Down()
{
Sql(DropFunctionScript);
}
#region SQL Scripts
private readonly string _createFunctionScript = string.Concat(
"CREATE FUNCTION [dbo].[fnIsPaid] ",
"(",
...
") ",
"RETURNS bit ",
"AS ",
"BEGIN ",
...
"END"
);
private const string DropFunctionScript = "DROP FUNCTION [dbo].[fnIsPaid]";
#endregion
}
Run Code Online (Sandbox Code Playgroud)
不,您只能告诉它将CRUD操作映射到存储过程(EF 6+),例如:
modelBuilder
.Entity<Post>()
.MapToStoredProcedures();
Run Code Online (Sandbox Code Playgroud)
但您可以在迁移中执行自定义SQL:
public override void Up()
{
Sql("CREATE FUNCTION [dbo].[fnIsPaid] ...");
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道老问题,但以防万一有人需要。如果您喜欢更简单灵活的方式。在 Configuration.cs 文件中创建一个方法。然后将您的 sql 脚本放入 \App_Data 目录中,这样您就可以将任何您喜欢的 SQL 脚本放入 .SQL 文件中。在 MVC 5.0、EF6.0 中运行良好
private void CreateProcedure(MvcAppDb context)
{
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + @"/Procedures.sql";
Console.WriteLine(path);
FileInfo file = new FileInfo(path);
string script = file.OpenText().ReadToEnd();
context.Database.ExecuteSqlCommand(script);
}
Run Code Online (Sandbox Code Playgroud)
然后添加对 Configuration.cs 的调用即可完成所有设置。
protected override void Seed(MvcAppDb context)
{
CreateProcedure(context);
Run Code Online (Sandbox Code Playgroud)