【问题标题】:Entity Framework code-first & stored procedure实体框架代码优先和存储过程
【发布时间】:2018-01-28 20:21:06
【问题描述】:

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

我正在使用实体框架代码优先方法。使用此方法,我创建了客户和其他一些实体。

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

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

创建过程 getcustomer @name nvarchar(max),@zipcode int

作为

select id,name,zipcode from Customer where name like (@name);

选择 id,name,zipcode from Customer where zipcode =@zipcode

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

1.单独传递name参数,返回第一个集合

2.单独传递邮政编码参数并返回第二个集合。

3.使用合并将1和2的结果集合合并到一个集合中

【问题讨论】:

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


    【解决方案1】:

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

    第 1 步:使用 Package Manager Console 中的add-migration SP_DO_NOT_DELETE 生成迁移脚本。如果没有 Model Changes 存在,那么系统将生成如下所示的 Empty 迁移脚本。

       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 作为第一步的情况下,我们应该有一个专用的 Store 过程文件(就像我们有 Context 类一样)& 在运行 update-database 时它应该创建SP
    • @lok​​anathdas 你可以使用 thi: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().MapToStoredProcedures(); } 看到这个链接:docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多