如何在Blazor中基于API生成CRUD,避免手动修改EF Core脚手架代码?
解决方案
1. 先通过脚手架生成Web API CRUD控制器
在Visual Studio中,生成API的CRUD有对应的脚手架选项:
- 右键项目 → 添加 → 新建脚手架项
- 选择API Controller with actions, using Entity Framework(不要选Razor Component)
- 选择目标模型类、DbContext类,确认后会自动生成包含完整CRUD接口的API控制器,实现标准的GET/POST/PUT/DELETE等RESTful操作。
2. 批量改造Blazor组件为API调用(避免手动修改40张表)
方式一:批量代码替换(快速见效)
利用Visual Studio的全局查找替换功能(支持正则表达式),批量替换现有Razor组件中的数据库操作代码:
- 替换注入语句:
把所有组件顶部的:
替换为:@inject IDbContextFactory<HypnoPlatform.Persistence.HypnoContext> DbFactory@inject HttpClient Http - 替换数据查询逻辑:
匹配类似:
替换为:await using var context = await DbFactory.CreateDbContextAsync(); var [entityList] = await context.[EntityName].ToListAsync();
(注意替换var [entityList] = await Http.GetFromJsonAsync<List<[EntityName]>>("api/[EntityNamePlural]");[EntityName]和[EntityNamePlural]为对应实体的名称和复数形式,比如Product对应Products) - 替换创建/编辑/删除逻辑:
- 创建操作:把
context.[EntityName].Add(entity); await context.SaveChangesAsync();替换为await Http.PostAsJsonAsync("api/[EntityNamePlural]", entity); - 编辑操作:把
context.Update(entity); await context.SaveChangesAsync();替换为await Http.PutAsJsonAsync($"api/[EntityNamePlural]/{entity.Id}", entity); - 删除操作:把
context.[EntityName].Remove(entity); await context.SaveChangesAsync();替换为await Http.DeleteAsync($"api/[EntityNamePlural]/{entity.Id}");
- 创建操作:把
方式二:自定义脚手架模板(一劳永逸)
如果后续还要生成新的组件,直接修改Visual Studio的Razor Component脚手架模板,让生成的代码默认使用API调用:
- 找到VS的脚手架模板路径(以VS2022社区版为例):
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Web Tools\Scaffolding\Templates\Mvc\RazorComponent - 复制现有模板文件(比如
List.cshtml.t4、Create.cshtml.t4等),修改其中的数据库操作代码为API调用逻辑:- 替换注入DbContextFactory的代码为注入HttpClient
- 将所有DbContext相关的CRUD代码替换为对应的HttpClient调用
- 保存修改后的模板,后续生成Razor组件时就会直接生成API调用版本的代码。
3. 注意事项
- 确保API项目和Blazor项目在同一解决方案中,或者在Blazor项目的
appsettings.json中配置正确的API地址,让HttpClient能正常访问API。 - 生成API控制器时,确认每个控制器的路由正确(默认是
api/[ControllerName],对应实体复数形式)。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

