如何在代码优先中创建函数
本文关键字:创建 函数 代码 | 更新日期: 2023-09-27 18:15:09
是否可以使用Code First
在sql server中创建数据库函数?
像
CREATE FUNCTION [dbo].[fnIsPaid] ...
以下是我根据ChrFin的建议得出的结果。我把它标记为答案。但让我在这里做一个更详细的记录。
在Package Manager Console,
添加迁移AddFnIsAid`中。
这将创建一个前缀为时间戳的DbMigration
类。
在这个迁移类中,我有一个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
}
否,您只能告诉它使用例如:将CRUD操作映射到存储过程(EF 6+(
modelBuilder
.Entity<Post>()
.MapToStoredProcedures();
但是您可以在迁移中执行自定义SQL:
public override void Up()
{
Sql("CREATE FUNCTION [dbo].[fnIsPaid] ...");
}
我知道这个老问题,但万一有人需要的话。如果你喜欢更简单灵活的方式。在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);
}
然后添加对Configuration.cs的调用,您就可以设置好了。
protected override void Seed(MvcAppDb context)
{
CreateProcedure(context);