如何在Code First中创建函数?

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)

Chr*_*Fin 5

不,您只能告诉它将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)