[TOC]
连接数据库
1. appsettings.json配置
- 在appsettings.json 文件中填写如下代码
localhost: 地址DemoDB: 数据库名称sa: 名称Password
"ConnectionStrings": {
"Default": "Server=localhost;Database=DemoDB;User ID=sa;Password=root;TrustServerCertificate=True;"
}2. 安装相关包
Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Relational Microsoft.EntityFrameworkCore.Tools
注意,.net core 什么版本,包就是什么版本
3. 创建 DatabaseContext 类
C
using Microsoft.EntityFrameworkCore;
/// <summary>
/// 数据库配置类
/// </summary>
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var loggerFactory = LoggerFactory.Create(builder =>
builder.AddConsole());
}
}4. 在主程序配置
在Program.cs程序添加如下代码,注意:
确认 AddDbContext 在 builder.Build() 之前调用。
C
using Microsoft.EntityFrameworkCore;
builder.Services.AddDbContext<DatabaseContext>(options =>
{
// 2. 自动获取连接字符串
var connectionString = builder.Configuration.GetConnectionString("Default");
options.UseSqlServer(connectionString);
});5. 创建实体类以及对应的配置类
注意 [Table("Users")] 只是加这个没用,还得在配置类里加上
public class Users
{
#region 固定
/// <summary>
/// 主键 ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 获取或设置新增时间。
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 获取或设置新增人 ID。
/// </summary>
public long CreatedById { get; set; }
/// <summary>
/// 获取或设置新增人姓名。
/// </summary>
[MaxLength(50)]
public string CreatedByName { get; set; }
/// <summary>
/// 获取或设置是否删除。
/// </summary>
public bool IsDeleted { get; set; }
/// <summary>
/// 获取或设置修改时间。
/// </summary>
public DateTime UpdatedAt { get; set; }
/// <summary>
/// 获取或设置修改人 ID。
/// </summary>
public long UpdatedById { get; set; }
/// <summary>
/// 获取或设置修改人姓名。
/// </summary>
[MaxLength(50)]
public string UpdatedByName { get; set; }
/// <summary>
/// 删除修改人 ID。
/// </summary>
public long DeleteById { get; set; }
/// <summary>
/// 删除姓名。
/// </summary>
[MaxLength(50)]
public string DeleteByName { get; set; }
/// <summary>
/// 获取或设置修改时间。
/// </summary>
[NotMapped]
public DateTime DeleteTime { get; set; }
#endregion
/// <summary>
/// 获取或设置用户的姓名。
/// </summary>
[Column(TypeName = "nvarchar(50)")]
public string Name { get; set; }
/// <summary>
/// 图像
/// </summary>
[Column(TypeName = "nvarchar(100)")]
public string Avatar { get; set; }
/// <summary>
/// 获取或设置用户的账号。
/// </summary>
[Column(TypeName = "nvarchar(50)")]
public string Account { get; set; }
/// <summary>
/// 获取或设置用户的密码。
/// </summary>
[Column(TypeName = "nvarchar(50)")]
public string Password { get; set; }
/// <summary>
/// 获取或设置用户的登录时间。
/// </summary>
[Column(TypeName = "datetime2(7)")]
public DateTime LoginTime { get; set; }
/// <summary>
/// 是否禁用
/// </summary>
[Column(TypeName = "bit")]
public bool IsEnabled { get; set; }
/// <summary>
/// 获取或设置用户的电话。
/// </summary>
[Column(TypeName = "nvarchar(50)")]
public string Phone { get; set; }
/// <summary>
/// Email
/// </summary>
[Column(TypeName = "nvarchar(50)")]
public string Email { get; set; }
/// <summary>
/// 性别 1男2女
/// </summary>
[Column(TypeName = "int")]
public int Gender { get; set; }
/// <summary>
/// 用户类型 1系统用户 2注册用户
/// </summary>
[Column(TypeName = "int")]
public int Type { get; set; }
/// <summary>
/// 部门
/// </summary>
[Column(TypeName = "bigint")]
public long DepartmentId { get; set; }
}C
public class UserConfig : IEntityTypeConfiguration<Users>
{
public void Configure(EntityTypeBuilder<Users> builder)
{
builder.ToTable("users");
builder.Property(e => e.Id)
.HasColumnType("bigint")
.ValueGeneratedNever();///这个 Id 字段的值永远不会由数据库自动生成(例如自增 ID)
}
}6. 通过命令行根据实体类生成数据库
点击工具 -》 NuGet 包管理器 -》 程序包管理器控制台
shell
Remove-Migration # 删除上一次迁移
Add-Migration InitialCreate #第一次成功后生成文件
Update-database
#如果要修改数据库表
Add-Migration AddBioToUser # 修改表字段名称之类的,会生成AddBioToUser 文件
Update-database7. 附上增删改查
C
using System.ComponentModel.DataAnnotations.Schema;
using AutoMapper;
using demo1.Mode;
using demo1.Uitl;
using DTO.UserControllerDTO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace demo1.Controllers
{
[Route("api/[controller]/[action]")]
public class UserController : ControllerBase
{
private readonly DatabaseContext DbContext;
private readonly IMapper _mapper;
public UserController(DatabaseContext dbContext,IMapper mapper)
{
this.DbContext = dbContext;
this._mapper = mapper;
}
[HttpPost]
public async Task<IActionResult> Add(long id,long userid,[FromBody] UserDtoAdd userDtoAdd)
{
bool iExsitic = DbContext.Set<Users>().Any(a => a.Id == id);
if (iExsitic)
{
return BadRequest("该ID已存在");
}
Users user = new Users();
user = _mapper.Map<Users>(userDtoAdd);
user.CreateId = userid;
user.Id = id;
DbContext.Set<Users>().Add(user);
await DbContext.SaveChangesAsync();
return Ok("完成输入!");
}
[HttpPost]
public async Task<IActionResult> Del(long id)
{
var users = await DbContext.Set<Users>().SingleOrDefaultAsync(a => a.Id == id);
if(users == null)
{
return BadRequest("找不到");
}
DbContext.Set<Users>().Remove(users);
await DbContext.SaveChangesAsync();
return Ok("完成输入!");
}
[HttpPost]
public async Task<IActionResult> Edit([FromBody] UsersEditDto usersDto)
{
if(usersDto.Id <= 0 )
{
return BadRequest("错误操作,请重新刷新");
}
var users = await DbContext.Set<Users>().SingleOrDefaultAsync(a => a.Id == usersDto.Id);
if (users == null)
{
return NotFound("找不到");
}
_mapper.Map(usersDto, users);
await DbContext.SaveChangesAsync();
return Ok("完成修改!");
}
[HttpPost]
public async Task<IActionResult> Find([FromBody] UsersFindDto dto)
{
// 1. 构建基础查询(动态添加条件)
var query = DbContext.Set<Users>().AsNoTracking(); // 只读查询,不跟踪
if (!string.IsNullOrWhiteSpace(dto.Phone))
query = query.Where(a => a.Phone == dto.Phone);
if (!string.IsNullOrWhiteSpace(dto.Name))
query = query.Where(a => a.Name == dto.Name);
if ( (dto.Gender == 0 || dto.Gender == 1))
query = query.Where(a => a.Gender == dto.Gender);
// 2. 获取总数
int totalCount = await query.CountAsync();
// 3. 应用分页(必须排序,假设按 Id 排序)
var items = await query
.OrderBy(a => a.Id)
.Skip((dto.PageIndex - 1) * dto.PageSize)
.Take(dto.PageSize)
.ToListAsync();
string sql = query.ToQueryString();
Console.WriteLine(sql);
// 4. 返回结果
return Ok(new
{
totalCount = totalCount,
pageIndex = dto.PageIndex,
pageSize = dto.PageSize,
items = items
});
}
}
}注意
8. 注意事项
如果运行命令出现如下
Build failed.那么就先运行一下程序,解决程序所有报错问题那就解决PM> Add-Migration InitialCreate Build started... Build failed.