我想将我的
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
首先,如果你想要一个自动递增的值,请使用序列。如果您想从 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);