如何在代码优先中创建函数

本文关键字:创建 函数 代码 | 更新日期: 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);