如何在.NET 6 EF Core类库项目中创建存储过程?
在EF Core(.NET 6)代码优先模式下创建存储过程的解决方案
EF Core不像旧版EF6那样提供内置的存储过程自动生成工具,代码优先模式下得通过手动编写迁移脚本来创建存储过程,以下是具体步骤:
1. 生成空迁移
先创建一个空的迁移文件,专门用来存放存储过程的创建脚本:
- 使用Package Manager Console:
Add-Migration CreateStoredProcedure_GetUserById - 使用.NET CLI:
dotnet ef migrations add CreateStoredProcedure_GetUserById
2. 编辑迁移文件
打开生成的迁移文件,在Up方法中写入创建存储过程的SQL,Down方法中写入删除脚本(用于回滚迁移):
protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(@" CREATE PROCEDURE GetUserById @UserId INT AS BEGIN SELECT Id, Name, Email FROM Users WHERE Id = @UserId END "); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(@"DROP PROCEDURE GetUserById"); }
3. 应用迁移到数据库
执行命令将迁移脚本应用到数据库,完成存储过程的创建:
- Package Manager Console:
Update-Database - .NET CLI:
dotnet ef database update
4. 在DbContext中封装存储过程调用
为了方便调用,可以在你的DbContext中添加方法,通过EF Core的FromSqlRaw(查询数据)或ExecuteSqlRaw(执行非查询)来调用存储过程,注意使用参数化查询避免SQL注入:
public async Task<User> GetUserByIdAsync(int userId) { var user = await Users.FromSqlRaw("EXEC GetUserById @UserId = {0}", userId) .FirstOrDefaultAsync(); return user; } // 带多参数的示例 public async Task<IEnumerable<User>> GetUsersByRoleAsync(string roleName, int pageSize) { var parameters = new[] { new SqlParameter("@RoleName", roleName), new SqlParameter("@PageSize", pageSize) }; return await Users.FromSqlRaw("EXEC GetUsersByRole @RoleName, @PageSize", parameters) .ToListAsync(); }
如果需要执行无返回值的存储过程(比如插入/更新操作),可以用ExecuteSqlRawAsync:
public async Task UpdateUserStatusAsync(int userId, bool isActive) { await Database.ExecuteSqlRawAsync( "EXEC UpdateUserStatus @UserId = {0}, @IsActive = {1}", userId, isActive); }
内容的提问来源于stack exchange,提问作者niler
相关产品推荐
相关产品推荐

