Skip to content

[TOC]

连接数据库

1. appsettings.json配置

  1. 在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-database

7. 附上增删改查

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.