实体框架代码优先&存储过程

时间:2017-08-20 18:32:46

标签: entity-framework stored-procedures ef-code-first

我在我的应用程序中使用代码优先方法。我使用这种方法生成了实体(表)。现在我想通过代码创建一个存储过程。当我尝试迁移选项并且它失败时,有人可以指导我。

我正在使用Entity Framework Code First方法。使用此方法,我创建了Customer和其他一些实体。

现在我想创建一个存储过程' GetCustomers'使用上下文类并传递参数并在集合中获取结果集

它必须返回2个集合,如下所示

create procedure getcustomer @name nvarchar(max),@ zipcode int

作为

从Customer中选择id,name,zipcode,其名称如(@name);

从客户处选择id,姓名,邮政编码,其中zipcode = @ zipcode

我想创建一个存储过程' GetCustomers'使用上下文类而不是在DB中手动执行。我需要实现以下结果:

1.单独使用名称参数并返回第一个集合

2.单独使用zipcode参数并返回第二个集合。

3.使用合并

将1和2的结果集合合并到单个集合中

1 个答案:

答案 0 :(得分:3)

您可以使用Add-使用CreateStoredProcedure()方法创建/生成存储过程  实体框架中的迁移选项。

第1步:使用程序包管理器控制台中的添加迁移SP_DO_NOT_DELETE 生成迁移脚本。如果没有模型更改,则系统将生成如下所示的空迁移脚本。

   public partial class SP_DO_NOT_DELETE : DbMigration
   {
      public override void Up()
      {      

      }

      public override void Down()
      {

      }
  }

第2步:生成脚本后,请在向上()向下()方法中添加存储过程,如下所示。 注意:以下示例," dbo.GetNextDisplayId"是存储过程名称,它将用于使用存储过程获取NextAvailableDisplayId。

   public partial class SP_DO_NOT_DELETE : DbMigration
   {
      public override void Up()
      {      
        CreateStoredProcedure(
          "dbo.GetNextDisplayId",
          body:
              @"DECLARE @requestid INT  
                        SELECT @requestid = NextAvailableDisplayId  
                        FROM [TrackingNumberHistories] WITH (TABLOCKX)  

                        UPDATE [TrackingNumberHistories]
                        SET NextAvailableDisplayId = @requestid + 1

                        SELECT @requestid AS 'NextAvailableDisplayId'"
        ); 
       }

       public override void Down()
       {
          DropStoredProcedure("dbo.GetNextDisplayId");
       }
  }
Up()

注意 CreateStoredProcedure()每当运行迁移脚本时,方法都会自动创建存储过程。当我们在迁移脚本中自动回滚/删除存储过程时, Down()中的 DropStoredProcedure()将用于删除存储过程。

希望这可以帮助你前进!!