描述:
ASP.NET 6 集成 EF Core,实现了增删查改:添加、多表添加、事务、条件查询、模糊查询、查询全部、只查一条数据、排序、分组、分页、使用sql查询、多表查询-join(lanbda)、多表查询另一种写法(linq)、求总数、求和、修改、删除
目录
1、创建项目
2、安装依赖
Install-Package Pomelo.EntityFrameworkCore.MySql -Version 6.0.2
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.20
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design -Version 6.0.15
3、创建Models文件夹
用途:存放数据库实体的地方
4、在程序包管理器控制台-执行命令生成实体
Scaffold-DbContext "server=127.0.0.1;userid=root;pwd=@admin123456;port=3305;database=jianyun;sslmode=Preferred;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force
Scaffold-DbContext 为 DbContext 数据库的和实体类型生成代码。 为了使 Scaffold-DbContext 生成实体类型,数据库表必须具有主键。 参数: SCAFFOLD-DBCONTEXT 参数 说明 -连接 用于连接到数据库的连接字符串。 对于 ASP.NET Core 2.x 项目,值可以是 name = 。 在这种情况下,该名称来自为项目设置的配置源。 这是一个位置参数,并且是必需的。 -提供程序 要使用的提供程序。 通常,这是 NuGet 包的名称,例如: Microsoft.EntityFrameworkCore.SqlServer 。 这是一个位置参数,并且是必需的。
-OutputDir 要在其中放置文件的目录。 路径相对于项目目录。
-ContextDir 要在其中放置文件的目录 DbContext 。 路径相对于项目目录。 -命名空间 要用于所有生成的类的命名空间。 默认值为从根命名空间和输出目录生成。 在 EF Core 5.0 中添加。
-ContextNamespace 要用于生成的类的命名空间 DbContext 。 注意:重写 -Namespace 。 在 EF Core 5.0 中添加。 -上下文 DbContext要生成的类的名称。 -架构 <String[]> 要为其生成实体类型的表的架构。 如果省略此参数,则包括所有架构。 -表 <String[]> 要为其生成实体类型的表。 如果省略此参数,则包括所有表。
-DataAnnotations 使用属性可在可能) 的情况下配置模型 (。 如果省略此参数,则只使用 Fluent API。
-UseDatabaseNames 使用表和列的名称与数据库中显示的名称完全相同。 如果省略此参数,则更改数据库名称以更严格地符合 c # 名称样式约定。
-Force 覆盖现有文件。
-NoOnConfiguring 不生成 DbContext.OnConfiguring 。 在 EF Core 5.0 中添加。
-NoPluralize 请勿使用复数化程序。 在 EF Core 5.0 中添加。
5、设置动态数据库连接
修改appsettings.json,添加数据库连接字符串
6、删除上下文对象中红框部分 
7、在Program.cs注册上下文并指定数据库连接字符串
8、实现增删查改
创建控制器:HomeController.cs
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using System.Linq;
using System.Net;
using WebApi.EFCore.Models;
namespace WebApi.EFCore.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class HomeController : ControllerBase
{
public readonly jianyunContext _jyContext;
public HomeController(jianyunContext jyContext)
{
_jyContext = jyContext;
}
/// <summary>
/// 添加、多表添加、事务
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> AddSysUser()
{
var tran = _jyContext.Database.BeginTransaction();//多表添加才用到
try
{
SysUser sysUser = new SysUser();
sysUser.Id = Guid.NewGuid().ToString("N");
sysUser.Name = "Test";
sysUser.Email = "1@qq.com";
sysUser.Phone = "123456";
sysUser.Sex = "0";
sysUser.CreateTime = DateTime.Now;
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.Id = Guid.NewGuid().ToString("N");
sysUserRole.UserId = sysUser.Id;
sysUserRole.RoleId = Guid.NewGuid().ToString("N");
sysUserRole.IsDelete = false;
sysUserRole.CreateBy = "admin";
await _jyContext.AddAsync(sysUser);
await _jyContext.AddAsync(sysUserRole);
var result = await _jyContext.SaveChangesAsync();
if (result > 0)
{
tran.Commit();//多表添加才用到
return Ok(new
{
Code = StatusCodes.Status200OK,
Message = "创建成功",
Data = sysUser.Id
});
}
else
{
return Ok(new
{
Code = StatusCodes.Status400BadRequest,
Message = "创建失败"
});
}
}
catch (Exception)
{
tran.Rollback();//多表添加才用到
return Ok(new
{
Code = StatusCodes.Status500InternalServerError,
Message = "创建异常"
});
}
}
/// <summary>
/// 条件查询、模糊查询、查询全部、只查一条数据、排序、分组、分页、使用sql查询、多表查询-join(lanbda)、多表查询另一种写法(linq)、求总数、求和
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> GetSysUser(string Id)
{
//条件查询
var result1 = await _jyContext.SysUsers.Where(n => n.Id == Id).ToListAsync();
//模糊查询
var result2 = await _jyContext.SysUsers.Where(n => n.Name.Contains("Test")).ToListAsync();
//查询全部
var result3 = await _jyContext.SysUsers.ToListAsync();
//只查一条数据
var result4 = await _jyContext.SysUsers.FirstOrDefaultAsync();
//排序
var result5 = await _jyContext.SysUsers.OrderBy(n => n.CreateTime).ToListAsync();
//分组
var result6 = _jyContext.SysUsers.AsEnumerable().GroupBy(n => n.Sex).ToList();
//分页
int pageIndex = 1;//分页索引:第几页
int pageSize = 10;//分页总数:一页多少条
var result7 = await _jyContext.SysUsers.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
//使用sql
//sys_user为数据库表名,SysUsers是实体名,不要混淆
String sql = string.Format($"select * from sys_user");
var res = _jyContext.SysUsers.FromSqlRaw(sql);
var result8 = await res.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
//多表查询-join
var result9 = _jyContext.SysUsers.Join(_jyContext.SysUserRoles, u => u.Id, r => r.UserId, (u, r) => new
{
name = u.Name,
roleId = r.RoleId,
}).ToList();
//多表查询另一种写法
var result10 = (
from u in _jyContext.SysUsers
join r in _jyContext.SysUserRoles on u.Id equals r.UserId into SysUserRoleList
from SysUserRole in SysUserRoleList.DefaultIfEmpty()
select new
{
u.Id,
u.Name,
SysUserRole.RoleId,
})
.ToList();
//求总数
var result11 = _jyContext.SysUsers.Count();
//求和
var result12 = _jyContext.SysLogs.Sum(n => n.Type);
return Ok();
}
/// <summary>
/// 修改
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> Update(string Id)
{
var sysUser = await _jyContext.SysUsers.Where(n => n.Id == Id).FirstOrDefaultAsync();
if (sysUser != null)
{
sysUser.Name = "1";
int result = _jyContext.SaveChanges();
if (result > 0)
{
return Ok(new
{
Code = StatusCodes.Status200OK,
Message = "修改成功"
});
}
else
{
return Ok(new
{
Code = StatusCodes.Status400BadRequest,
Message = "修改失败"
});
}
}
else
{
return Ok(new
{
Code = StatusCodes.Status400BadRequest,
Message = "查询无数据"
});
}
}
/// <summary>
/// 删除
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> Delete(string Id)
{
var sysUser = await _jyContext.SysUsers.Where(n => n.Id == Id).FirstOrDefaultAsync();
if (sysUser != null)
{
_jyContext.SysUsers.Remove(sysUser);
int result = _jyContext.SaveChanges();
if (result > 0)
{
return Ok(new
{
Code = StatusCodes.Status200OK,
Message = "删除成功"
});
}
else
{
return Ok(new
{
Code = StatusCodes.Status400BadRequest,
Message = "删除失败"
});
}
}
else
{
return Ok(new
{
Code = StatusCodes.Status400BadRequest,
Message = "查询无数据"
});
}
}
}
}