1 创asp.net web api项目。并安装依赖包。
依次安装nuget 依赖。
<ItemGroup>
<PackageReference Include="EntityFramework" Version="6.4.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.7">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.7">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.2" />
</ItemGroup>
2 db first 把数据表的表,转为model.
2.1 用脚手架,生成models.
进入终端 执行脚本。 dotnet ef dbcontext Scaffold "server=localhost;port=3306;uid=root;pwd=xuxing;database=ef_demo;" Pomelo.EntityFrameworkCore.MySql -o Models
脚本运行效果
Build started...
Build succeeded.
To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration -
see go.microsoft.com/fwlink/?lin…. For more guidance on storing connection strings, see go.microsoft.com/fwlink/?Lin… Using ServerVersion '8.0.25-mysql'.执行后,将生成如下文件:
2.2 一些后续手续,与优化。
ef_demoContext 不符合代码规范,重命名为efDemoContext.cs
appsettings.json 文件 ,设置配置文件。
"ConnectionStrings": {
"MySQLConnection": "server=localhost;port=3306;uid=root;pwd=xuxing;database=ef_demo"
},
program.cs ioc注入。
builder.Services.AddDbContext<efDemoContext>(opt => {
string connectionString = builder.Configuration.GetConnectionString("MySQLConnection");
var serverVersion = ServerVersion.AutoDetect(connectionString);
opt.UseMySql(connectionString, serverVersion);
});
3 创建控制器,实现最简单的crud. (按restFul 标准 。)
一些准备工作。 控制器拿到context
efDemoContext _demoContext;
public TestController()
{
this._demoContext = new efDemoContext();
}
3.1 添加数据。
代码部分
/// <summary>
/// 添加数据
/// </summary>
/// <param name="stuData"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost]
public IActionResult Create(TbStu stuData)
{
//重名验证。
var ckStu = _demoContext.TbStus.FirstOrDefault(c => c.Tname.Equals(stuData.Tname));
if (ckStu != null)
{
return BadRequest(new { conut = -1, msg = "添加失败,ip " });
}
_demoContext.TbStus.Add(stuData);
if (_demoContext.SaveChanges() >=0)
{
return Ok();
}
else {
throw new Exception("添加失败。");
}
}
swagger 下调试
成功时。
重名时。
3.2 读取数据详情
[HttpGet]
public ActionResult Detail(int id)
{
var findStu = _demoContext.TbStus.FirstOrDefault(c => c.Id.Equals(id));
if (findStu == null)
{
return BadRequest(new { conut = -1, msg = "未找到学员" });
}
return Ok(findStu);
}
3.3 读所有学员。
[HttpGet]
public ActionResult GetList()
{
List<TbStu> stus = _demoContext.TbStus.ToList();
return Ok(stus);
}
修改,删除
[HttpPut]
public IActionResult Modify(TbStu stuData)
{
var ckStu = _demoContext.TbStus.FirstOrDefault(c => c.Id.Equals(stuData.Id));
if (ckStu == null)
{
return BadRequest(new { conut = -1, msg = "学员不存在,无法修改" });
}
_demoContext.TbStus.Update(stuData);
if (_demoContext.SaveChanges() >=0)
{
return Ok();
}
else
{
throw new Exception("修改失败。");
}
}
[HttpPut]
public IActionResult Remove(int id)
{
var ckStu = _demoContext.TbStus.FirstOrDefault(c => c.Id.Equals(id));
if (ckStu == null)
{
return BadRequest(new { conut = -1, msg = "学员不存在,无法删除" });
}
_demoContext.TbStus.Remove(ckStu);
if (_demoContext.SaveChanges() >=0)
{
return Ok();
}
else
{
throw new Exception("删除失败。");
}
}
注意细节, 此处仅为了学习走通 ef + mysql db first 基础示例。 IActionResult 返回的仅为存数据。code 为 StatusCode .
而大多数接口,并不这样折腾 ,直接把所有返回数据,写成json 中,供前端处理。 还有就是,就请求习惯而言,前端更多的是一 post 到底 ,不去花心思严重遵守restFul . 当然,最后如何写,跟着公司规范走。