如何在ASP.NET Core Web API中调用存储过程实现自增

问题描述 投票:0回答:1

我想将我的

employeeNumber
自动递增 001、002 等。为此,我在 SQL Server 中创建了一个存储过程。我想在 ASP.NET Core Web API 中调用该存储过程。我正在使用实体框架和代码优先方法。

注意:如果有任何错误请原谅这是我第一次使用 Stack Overflow

SELECT TOP (1000) 
    [employeeID],
    [employeeName],
    [employeeAddress],
    [gender],
    [number],
    [employeeNumber]
FROM 
    [EmployeeListDB].[dbo].[Employees]

EXEC GenerateEmployeeNumber2

这是我的存储过程:

ALTER PROCEDURE [dbo].[GenerateEmployeeNumber2]
AS
BEGIN
    DECLARE @NextEmployeeNumber VARCHAR(10);
    DECLARE @MaxEmployeeNumber INT;

    SELECT @MaxEmployeeNumber = MAX(CAST(employeeNumber AS INT)) 
    FROM Employees

    IF @MaxEmployeeNumber IS NULL 
       SET @NextEmployeeNumber = '001'
    ELSE
       SET @NextEmployeeNumber = RIGHT('000' + CAST(@MaxEmployeeNumber + 1 AS varchar(10)), 3)

     SELECT @NextEmployeeNumber AS NewEmployeeNumber
END

在 ASP.NET Core Web API 中,我为此创建了一个存储库和一个控制器类

using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace EmployeeList.Modals
{
    public class Employee
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int employeeID { get; set; }

        public string? employeeNumber { get; set; }
        public string? employeeName { get; set; }
        public string? employeeAddress { get; set; }
        public string? gender { get; set; }
        public string? number { get; set; }
    }
}

我的

dbContext

using EmployeeList.Modals;
using Microsoft.EntityFrameworkCore;
using System.Diagnostics;

namespace EmployeeList.Data
{
    public class EmployeeListContext : DbContext
    {
        public EmployeeListContext(DbContextOptions<EmployeeListContext> options): base(options) 
        {
        }

        public DbSet<Employee> Employees { get; set; }
    }
}

我的存储库:

using EmployeeList.Data;
using Microsoft.EntityFrameworkCore;
using System.Diagnostics.Eventing.Reader;

namespace EmployeeList.Repository
{
    public class EmployeeNumberRepository
    {
        private readonly EmployeeListContext _Context;

        public EmployeeNumberRepository(EmployeeListContext Context)
        {
            _Context = Context;
        }

        public async Task<string> GnenerateNextEmployeeNumber()
        {
            var nextEmployeeNumber = await _Context.Employees.FromSqlRaw("EXEC GenerateEmployeeNumber2")
               .Select(e => e.employeeNumber)
               .FirstOrDefaultAsync();

            return nextEmployeeNumber;
        }
    }
}

我的控制器:

namespace EmployeeList.Controllers
{
    [ApiController]
    public class EmployeeNumberController : ControllerBase
    {
        private readonly EmployeeNumberRepository _Repo;

        public EmployeeNumberController(EmployeeNumberRepository Repo)
        {
            _Repo= Repo;
        }

        [HttpGet]
        [Route("GnenerateNextEmployeeNumber")]

        public async Task<ActionResult<string>> GnenerateNextEmployeeNumber()
        {
            var nextEmployeeNumber = await _Repo.GnenerateNextEmployeeNumber();
            return Ok(nextEmployeeNumber);
        }
    }
}

在我的 swagger 或邮递员中,我收到 http 500 错误 - 我想要值 001 (我将把它放在我的前端)。在我的存储库中,当我添加调试器时,我得到 var nextEmployeeNumber 的值为 null

stored-procedures asp.net-core-webapi
1个回答
0
投票

首先,如果你想要一个自动递增的值,请使用序列。如果您想从 EF 代码中调用它,您可以通过将其放入 DBcontext 类(在其中分配实体)的 OnModelCreating 中来在 EF 中进行操作。

builder.HasSequence("MyNameForTheSequence", s => s.StartsAt(1).IncrementsBy(1));

你这样称呼它

return _context.Database.SqlQuery<int>("SELECT NEXT VALUE FOR MyNameForTheSequence");

调用存储过程很简单:

this.Database.SqlQuery<YourEntityType>("MyNameForTheStoredProc",params);
© www.soinside.com 2019 - 2024. All rights reserved.