Entity Framework的Code-First和存储过程

3
我正在使用代码优先的方法在我的应用程序中。我已经使用这种方法生成了实体(表)。现在我还想通过代码创建一个存储过程。有人能指导一下我吗?我尝试了迁移选项,但它失败了。
我正在使用Entity Framework Code First方法。使用这种方法,我已经创建了客户和其他一些实体。
现在我想使用上下文类创建一个存储过程“GetCustomers”,并传递参数,并在集合中获得结果集。
它必须返回以下2个集合:
create procedure getcustomer @name nvarchar(max),@zipcode int
as
select id,name,zipcode from Customer where name like (@name );
select id,name,zipcode from Customer where zipcode =@zipcode
我想使用上下文类创建存储过程“GetCustomers”,而不是手动在数据库中执行。我需要实现以下结果:
1.只传递名称参数并返回第一个集合。
2.只传递邮政编码参数并返回第二个集合。
3.使用合并将第1和第2个结果集合并成单个集合。
1个回答

4
您可以使用Entity Framework的Add-Migration选项并使用CreateStoredProcedure()方法创建/生成存储过程。 步骤1:在包管理器控制台中使用add-migration SP_DO_NOT_DELETE生成迁移脚本。如果没有模型更改,则系统会生成类似下面的空迁移脚本。
   public partial class SP_DO_NOT_DELETE : DbMigration
   {
      public override void Up()
      {      

      }

      public override void Down()
      {

      }
  }

步骤 2: 生成脚本后,请按以下方式将您的存储过程添加到Up()down()方法中。 注意: 在下面的示例中,“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()将会在回滚/删除存储过程时自动删除存储过程。希望这能帮助您进一步了解!

有没有办法在运行Add-Migration之前,我们可以拥有一个专门的存储过程文件(就像我们拥有Context类一样),并在运行update-database时创建存储过程? - lokanath das
@lokanathdas,您可以使用以下代码:protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<yourEntity>().MapToStoredProcedures();
}请参阅此链接:https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/cud-stored-procedures
- MarchalPT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接