当前位置: 首页 > news >正文

.NET-EFCore基础知识

.NET EF Core(Entity Framework Core)是微软开发的一款开源的对象关系映射(ORM)框架,用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识:

1. 什么是 EF Core

EF Core 是.NET 平台下的一个数据访问技术,它允许开发者使用.NET 对象来表示数据库中的数据,并通过对象的操作来实现对数据库的增删改查等操作,无需编写大量的 SQL 语句。

2. 核心概念

  • DbContext:是 EF Core 中的核心类,它表示与数据库的会话,用于管理实体对象的生命周期、跟踪对象的变化以及与数据库进行交互。例如,通过DbContext可以查询数据库中的数据、将新对象插入到数据库、更新或删除现有对象等。
  • 实体类:是用于表示数据库表中数据的.NET 类。每个实体类的实例对应数据库表中的一行数据,实体类的属性对应表中的列。例如,可以创建一个User实体类来表示数据库中的User表,其中User类的Id属性对应User表中的Id列。
  • DbSet:是DbContext中的属性,用于表示数据库中的表。它提供了对实体类集合的操作,例如查询、添加、删除实体等。例如,在DbContext中定义DbSet<User>,就可以通过它来操作User实体对应的数据库表。

3. 安装与配置

  • 安装:可以通过 NuGet 包管理器安装 EF Core 相关的包。例如,要使用 SQL Server 数据库,需要安装Microsoft.EntityFrameworkCore.SqlServer包。
  • 配置:在Startup.cs文件的ConfigureServices方法中,需要配置DbContext。例如,对于 SQL Server 数据库,可以使用以下代码配置:

csharp

services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

这里ApplicationDbContext是自定义的DbContext类,DefaultConnection是在配置文件中定义的数据库连接字符串。

4. 数据迁移

EF Core 的数据迁移功能允许开发者在不丢失数据的情况下对数据库架构进行更改。例如,当实体类的属性发生变化时,可以通过数据迁移来更新数据库表的结构。可以使用命令行工具dotnet ef migrations add <MigrationName>来添加一个新的迁移,然后使用dotnet ef database update来将迁移应用到数据库。

5. 查询数据

可以使用DbSetQuery方法来查询数据。例如,要查询所有的User实体,可以使用以下代码:

csharp

using (var context = new ApplicationDbContext())
{var users = context.Users.ToList();
}

还可以使用 LINQ 语句对查询进行过滤、排序等操作。例如,查询年龄大于 18 岁的用户:

csharp

using (var context = new ApplicationDbContext())
{var users = context.Users.Where(u => u.Age > 18).ToList();
}

6. 插入、更新和删除数据

  • 插入数据:创建一个实体类的实例,然后使用DbSetAdd方法将其添加到DbContext中,最后调用SaveChanges方法将数据保存到数据库。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = new User { Name = "John Doe", Age = 25 };context.Users.Add(user);context.SaveChanges();
}
  • 更新数据:先从数据库中获取要更新的实体对象,然后修改其属性值,最后调用SaveChanges方法保存更改。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = context.Users.FirstOrDefault(u => u.Id == 1);if (user!= null){user.Name = "Jane Doe";context.SaveChanges();}
}
  • 删除数据:从数据库中获取要删除的实体对象,然后使用DbSetRemove方法将其从DbContext中移除,最后调用SaveChanges方法。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = context.Users.FirstOrDefault(u => u.Id == 1);if (user!= null){context.Users.Remove(user);context.SaveChanges();}
}

7. 关系映射

EF Core 支持实体之间的关系映射,如一对一、一对多、多对多关系。例如,一个User可以有多个Order,这是一对多关系。可以通过在实体类中定义导航属性来表示这种关系。例如,在User类中定义ICollection<Order>类型的属性来表示用户的订单集合,在Order类中定义User类型的属性来表示订单所属的用户。

8.基础操作类

9.通用EF的Service类和IService

using IService;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace IService
{public interface IBaseService{#region--伪代码//public void Add();//public void Delete();//public void Update();//public void Query();#endregion#region Query/// <summary>/// 主键查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public T Find<T>(int id) where T : class;/// <summary>/// 不应该暴露给上端使用者,尽量少用/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>//[Obsolete("尽量避免使用,using 带表达式目录树的代替")]public IQueryable<T> Set<T>() where T : class;/// <summary>/// 这才是合理的做法,上端给条件,这里查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="funcWhere"></param>/// <returns></returns>public IQueryable<T> Query<T>(Expression<Func<T, bool>> funcWhere) where T : class;/// <summary>/// 分页查询/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="S"></typeparam>/// <param name="funcWhere"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <param name="funcOrderby"></param>/// <param name="isAsc"></param>/// <returns></returns>public PagingData<T> QueryPage<T, S>(Expression<Func<T, bool>> funcWhere, int pageSize, int pageIndex, Expression<Func<T, S>> funcOrderby, bool isAsc = true) where T : class;#endregion#region Insert/// <summary>/// 即使保存  不需要再Commit/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>/// <returns></returns>public T Insert<T>(T t) where T : class;/// <summary>/// 新增集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tList"></param>/// <returns></returns>public IEnumerable<T> Insert<T>(IEnumerable<T> tList) where T : class;#endregion#region Update/// <summary>/// 是没有实现查询,直接更新的,需要Attach和State/// /// 如果是已经在context,只能再封装一个(在具体的service)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Update<T>(T t) where T : class;/// <summary>/// 修改一个集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tList"></param>public void Update<T>(IEnumerable<T> tList) where T : class;#endregion#region Delete/// <summary>/// 先附加 再删除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Delete<T>(T t) where T : class;/// <summary>/// 还可以增加非即时commit版本的,/// 做成protected/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Id"></param>public void Delete<T>(int Id) where T : class;public void Delete<T>(IEnumerable<T> tList) where T : class;#endregion#region Other/// <summary>/// 执行Sql语句,返回IQueryable/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public IQueryable<T> ExcuteQuery<T>(string sql, SqlParameter[] parameters) where T : class;/// <summary>/// 执行Sql语句,返回实体对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>public void Excute<T>(string sql, SqlParameter[] parameters) where T : class;#endregionList<T> FindEntitiesByProperty<T, TProperty>(System.Linq.Expressions.Expression<System.Func<T, TProperty>> propertySelector, TProperty value) where T : class;}
}----------------------------------------------------------------------------------
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using IService;namespace Service
{public abstract class BaseService : IBaseService{#region--伪代码//public void Add()//{//    throw new NotImplementedException();//}//public void Delete()//{//    throw new NotImplementedException();//}//public void Query()//{//    throw new NotImplementedException();//}//public void Update()//{//    throw new NotImplementedException();//}#endregionprotected DbContext Context { get; set; }/// <summary>/// 构造函数注入/// </summary>/// <param name="context"></param>public BaseService(DbContext context){Context = context;}#region Query/// <summary>/// 主键查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public T Find<T>(int id) where T : class{return this.Context.Set<T>().Find(id);}/// <summary>/// 不应该暴露给上端使用者,尽量少用/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>//[Obsolete("尽量避免使用,using 带表达式目录树的代替")]public IQueryable<T> Set<T>() where T : class{return this.Context.Set<T>();}/// <summary>/// 这才是合理的做法,上端给条件,这里查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="funcWhere"></param>/// <returns></returns>public IQueryable<T> Query<T>(Expression<Func<T, bool>> funcWhere) where T : class{return this.Context.Set<T>().Where<T>(funcWhere);}/// <summary>/// 分页查询/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="S"></typeparam>/// <param name="funcWhere"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <param name="funcOrderby"></param>/// <param name="isAsc"></param>/// <returns></returns>public PagingData<T> QueryPage<T, S>(Expression<Func<T, bool>> funcWhere, int pageSize, int pageIndex, Expression<Func<T, S>> funcOrderby, bool isAsc = true) where T : class{var list = Set<T>();if (funcWhere != null){list = list.Where<T>(funcWhere);}if (isAsc){list = list.OrderBy(funcOrderby);}else{list = list.OrderByDescending(funcOrderby);}PagingData<T> result = new PagingData<T>(){DataList = list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(),PageIndex = pageIndex,PageSize = pageSize,RecordCount = list.Count()};return result;}#endregion#region Insert/// <summary>/// 即使保存  不需要再Commit/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>/// <returns></returns>public T Insert<T>(T t) where T : class{this.Context.Set<T>().Add(t);this.Commit();//写在这里  就不需要单独commit  不写就需要return t;}public IEnumerable<T> Insert<T>(IEnumerable<T> tList) where T : class{this.Context.Set<T>().AddRange(tList);this.Commit();//一个链接  多个sqlreturn tList;}#endregion#region Update/// <summary>/// 是没有实现查询,直接更新的,需要Attach和State/// /// 如果是已经在context,只能再封装一个(在具体的service)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Update<T>(T t) where T : class{if (t == null) throw new Exception("t is null");this.Context.Set<T>().Attach(t);//将数据附加到上下文,支持实体修改和新实体,重置为UnChangedthis.Context.Entry<T>(t).State = EntityState.Modified;this.Commit();//保存 然后重置为UnChanged}public void Update<T>(IEnumerable<T> tList) where T : class{foreach (var t in tList){this.Context.Set<T>().Attach(t);this.Context.Entry<T>(t).State = EntityState.Modified;}this.Commit();}#endregion#region Delete/// <summary>/// 先附加 再删除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Delete<T>(T t) where T : class{if (t == null) throw new Exception("t is null");this.Context.Set<T>().Attach(t);this.Context.Set<T>().Remove(t);this.Commit();}/// <summary>/// 还可以增加非即时commit版本的,/// 做成protected/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Id"></param>public void Delete<T>(int Id) where T : class{T t = this.Find<T>(Id);//也可以附加if (t == null) throw new Exception("t is null");this.Context.Set<T>().Remove(t);this.Commit();}public void Delete<T>(IEnumerable<T> tList) where T : class{foreach (var t in tList){this.Context.Set<T>().Attach(t);}this.Context.Set<T>().RemoveRange(tList);this.Commit();}#endregion#region Otherpublic void Commit(){Context.SaveChanges(); //EFCore中对于增删改 ,必须要执行这句话才能生效}/// <summary>/// 执行Sql语句,返回IQueryable/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public IQueryable<T> ExcuteQuery<T>(string sql, SqlParameter[] parameters) where T : class{return this.Context.Set<T>().FromSqlRaw(sql, parameters);}/// <summary>/// 执行Sql语句,返回实体对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>public void Excute<T>(string sql, SqlParameter[] parameters) where T : class{IDbContextTransaction trans = null;try{trans = Context.Database.BeginTransaction();this.Context.Database.ExecuteSqlRaw(sql, parameters);trans.Commit();}catch (Exception){if (trans != null)trans.Rollback();throw;}}/// <summary>/// 释放回收/// </summary>public virtual void Dispose(){if (Context != null){Context.Dispose();}}#endregionpublic List<T> FindEntitiesByProperty<T, TProperty>(Expression<Func<T, TProperty>> propertySelector, TProperty value) where T : class{var propertyValueEqualExpression = Expression.Equal(propertySelector.Body, Expression.Constant(value));var lambda = Expression.Lambda<Func<T, bool>>(propertyValueEqualExpression, propertySelector.Parameters);return Context.Set<T>().Where(lambda).ToList();}}
}

10.创建表的案例


using DbModels;
using static System.Runtime.InteropServices.JavaScript.JSType;namespace Initial_EFDB
{internal class Program{static void Main(string[] args){string connectionString = "Data Source=WIN-20240630YNV\\SQLEXPRESS;" +"Initial Catalog= EFCoreTestDB;Persist Security Info=True;User ID=sa;" +"Password=lyh2016;Encrypt=True;Trust Server Certificate=True";Console.WriteLine("Hello, World!");using (AgiletyDbContext context = new AgiletyDbContext(connectionString)){//根据数据库连接字符串的配置删除数据库,如果不存在就不操作context.Database.EnsureDeleted();//根据数据库连接字符串的配置创建数据库,如果存在就不创建  context.Database.EnsureCreated();var adduser = new DbModels.Models.UserEntity(){Address = "武汉市",Email = "18672554858@163.com",Imageurl = "",LastLoginTime = DateTime.Now,Mobile = "18672554858",Name = "Ricahrd",Password = "123456",QQ = "8542313245",Phone = "15845858858",Sex = 1,UserType = 1,WeChat = ""};context.UserEntities.Add(adduser);context.SaveChanges();查询//UserEntity user = context.UserEntities.OrderByDescending(c => c.UserId).FirstOrDefault();//user.Name = "Richard 老师";//context.SaveChanges();//context.Remove(user);//context.SaveChanges();}}}
}

11.数据操作案例UserService和IUserService

using ModelDto;namespace IService
{public interface IUserService: IBaseService{/// <summary>/// 登录功能/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <returns></returns>public UserDto? Login(string userName, string password);public void ShowUserAndCompany();public void SetUserAndCompany();}
}-----------------------------------------------------------------------using AutoMapper;
using Microsoft.EntityFrameworkCore;
using DbModels.Models;
using IService;
using ModelDto;
using Service;namespace Zhaoxi.AgiletyFramework.BusinessServices
{public class UserService : BaseService, IUserService{private readonly IMapper _IMapper;public UserService(DbContext context, IMapper iMapper) : base(context){_IMapper = iMapper;}/// <summary>/// 登录功能/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <returns></returns>public UserDto? Login(string userName, string password){string pwd = password;// MD5Encrypt.Encrypt(password);List<UserEntity> userList = Context.Set<UserEntity>().Where(c => c.Name.Equals(userName) && c.Password.Equals(pwd)).ToList();if (userList == null || userList.Count <= 0){return null;}UserEntity user = userList.First();UserDto userDto = _IMapper.Map<UserEntity, UserDto>(user);List<int> roleIdList = Context.Set<UserRoleMapEntity>().Where(c => c.UserId == user.UserId).Select(r => r.RoleId).ToList();userDto.RoleIdList = roleIdList;//设置登录用户角色//登录用户的菜单idList<Guid> userMenuIds = Context.Set<RoleMenuMapEntity>().Where(c => roleIdList.Contains(c.Id)).Select(c => c.MenuId).ToList();return userDto;}/// <summary>/// Autofac支持额aop扩展,如果通过类的方式来支持Aop,只有定义成Virtual方法,才能够进入到aop内部去;/// </summary>public virtual void SetUserAndCompany(){}public void ShowUserAndCompany(){ }}
}

12.控制器的应用案例

using AutoMapper;
using DbModels.Models;
using EFTest.Comm;
using IService;
using Microsoft.AspNetCore.Mvc;
using ModelDto;
using Service;namespace EFTest.Controllers
{/// <summary>/// Api控制器,用户相关的API/// </summary>[Route("api/[controller]/[action]")] // 修改路由前缀,包含控制器名称和方法名称[ApiController]public class UserController : ControllerBase{private readonly IUserService _IUserService;private readonly IMapper _IMapper;   //AutoMapper映射使用/// <summary>/// 构造函数/// </summary>/// <param name="iUserService"></param>/// <param name="iMapper"></param>public UserController( IUserService iUserService, IMapper iMapper){_IUserService = iUserService;_IMapper = iMapper;}/// <summary>/// 获取用户的分页列表/// </summary>/// <param name="pageindex"></param>/// <param name="pageSize"></param>/// <param name="searchaString"></param>/// <returns></returns>[HttpGet][Route("{pageindex:int}/{pageSize:int}")][Route("{pageindex:int}/{pageSize:int}/{searchaString}")]public async Task<JsonResult> GetUserPageAsync(int pageindex, int pageSize, string? searchaString = null){PagingData<UserEntity> paging = _IUserService.QueryPage<UserEntity, DateTime>(!string.IsNullOrWhiteSpace(searchaString) ? c => c.Name.Contains(searchaString) : a => true, pageSize, pageindex, c => c.CreateTime, false);PagingData<UserDto> pagingResult = _IMapper.Map<PagingData<UserEntity>, PagingData<UserDto>>(paging);JsonResult result = new JsonResult(new ApiDataResult<PagingData<UserDto>>(){Data = pagingResult,Success = true,Message = "用户分页列表"});return await Task.FromResult(result);}/// <summary>/// 新增用户/// </summary>/// <param name="userDto"></param>/// <returns></returns>[HttpPost]public async Task<JsonResult> AddUserAsync([FromBody] AddUserDto userDto){UserEntity adduser = _IMapper.Map<AddUserDto, UserEntity>(userDto);UserEntity user = _IUserService.Insert(adduser);var result = new JsonResult(new ApiDataResult<UserEntity>() { Data = adduser, Success = true, Message = "添加用户" });if (user.UserId <= 0){result = new JsonResult(new ApiDataResult<UserEntity>() { Data = adduser, Success = false, Message = "添加用户失败" });}return await Task.FromResult(result);}/// <summary>/// 根据名称查询用户列表/// </summary>/// <param name="name">要查询的用户名</param>/// <returns>符合条件的用户列表</returns>[HttpGet]public IActionResult SelectByName(string name){if (string.IsNullOrEmpty(name)){return BadRequest("用户名不能为空");}var userList = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name, name);return Ok(userList);}/// <summary>/// 基于 name 对 User 模型进行数据更新/// <param name="updatedUser">更新后的用户数据</param>/// <returns>返回更新结果信息</returns>[HttpPost]public async Task<IActionResult> UpdateUserByName(UserEntity updatedUser){try{// 根据 name 查询用户列表var usersToUpdate = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name ,updatedUser.Name);if (usersToUpdate == null || usersToUpdate.Count == 0){return NotFound($"没有找到名为 {updatedUser.Name} 的用户");}// 更新每个找到的用户foreach (var user in usersToUpdate){// 这里简单地将更新后的属性值赋给原用户对象,你可以根据实际需求进行更复杂的属性更新逻辑//user.UserId = updatedUser.UserId;user.Sex = updatedUser.Sex;user.Address = updatedUser.Address;user.Name= updatedUser.Name;_IUserService.Update(user);}return Ok($"成功更新了名为 {updatedUser.Name} 的用户数据");}catch (Exception ex){return StatusCode(500, $"更新用户数据时发生错误: {ex.Message}");}}/// <summary>/// 基于 name 对 User 模型进行数据删除/// </summary>/// <param name="name">要删除的用户的 name</param>/// <returns>返回删除结果信息</returns>[HttpDelete("{name}")]public async Task<IActionResult> DeleteUserByName(string name){try{// 根据 name 查询用户列表var usersToDelete = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name, name);if (usersToDelete == null || usersToDelete.Count == 0){return NotFound($"没有找到名为 {name} 的用户");}// 删除每个找到的用户_IUserService.Delete<UserEntity>(usersToDelete);return Ok($"成功删除了名为 {name} 的用户数据");}catch (Exception ex){return StatusCode(500, $"删除用户数据时发生错误: {ex.Message}");}}/// <summary>/// 查询 user 表所有数据/// </summary>/// <returns>返回 user 表的所有数据</returns>[HttpGet]public async Task<IActionResult> GetAllUsers(){try{// 调用 IBaseService 的 Query 方法查询所有 User 数据var users = _IUserService.Query<UserEntity>(u => true).ToList();return Ok(users);}catch (Exception ex){return StatusCode(500, $"查询用户数据时发生错误: {ex.Message}");}}}
}

相关文章:

.NET-EFCore基础知识

.NET EF Core&#xff08;Entity Framework Core&#xff09;是微软开发的一款开源的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;用于在.NET 应用程序中与数据库进行交互。以下是一些.NET EF Core 的基础知识&#xff1a; 1. 什么是 EF Core EF Core 是.NET 平…...

R语言基础包可视化(一:axis函数)

R语言基础包可视化(一:axis函数) 背景axis函数(坐标轴函数)各参数的图片示例hadj和padjline和poslty,lwd,lwd.ticksgap.axis总结背景 之前在介绍正态Q-Q图的过程中,画过标准正态分布的随机数、分数数、分布函数、密度函数的图像,相关的文章连接参考此处:R语言正态Q-Q图…...

Axure疑难杂症:垂直菜单折叠与展开(玩转垂直菜单)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:垂直菜单折叠与展开 主要内容:折叠与展开效果 应用场景:PC后台菜单、动态下拉菜单、商品分类选择等折叠与展开场景 案例展示: 案例视频: 垂直菜单折叠与展开效果 正文内容: 关于垂直菜单的折叠与…...

docker 中跑faster-whisper 教程(1050显卡)

之前我本地机器运行faster-whisper 会报错类似 Could not load library libcudnn_ops_infer.so.8github 上也有类似的情况 &#xff1a;https://github.com/SYSTRAN/faster-whisper/issues/516#issuecomment-2785038635 缺少.so.8 文件&#xff0c;我通过以下方式&#xff0c;…...

MySQL 在 CentOS 7 环境安装完整步骤

1. 卸载已有环境&#xff08;MariaDB/旧版MySQL&#xff09; 1.停止 MariaDB 服务 systemctl stop mariadb.service 2.检查并卸载 MariaDB/MySQL 安装包 rpm -qa | grep mariadb # 检查 MariaDB 相关包 rpm -qa | grep mysql # 检查 MySQL 相关包 sudo yum remo…...

下一代智能爬虫框架:ScrapeGraphAI 详解

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、ScrapeGraphAI 概述1.1 ScrapeGraphAI介绍1.2 核心特点1.3 工作流程1.4 关键模块1.5 对比传统爬虫框架1.6 安装二、基础操作2.1 自定义解析规则2.2 数据后处理2.3 分布式爬取三、高级功能3.1 多步骤交互采集3.2 动态…...

C++-ffmpeg-2-3-工厂模式封装SDL-9-7

1.接口设计 2.窗口渲染器和材质初始化 3.渲染Draw并测试渲染YUV 4.渲染画面随窗口大小自动缩放并抗锯齿 5.清理接口和接收窗口退出事件 1.接口设计&#xff1a;原则 主要的实现步骤&#xff1a; main的流程&#xff1a; 1打开文件 yuv_file.open("400_300_25.yuv&quo…...

下载极客漫画——Beautiful Soup实用案例

文章目录 一、背景介绍 二、实现思路 三、效果图 四、构思 五、实现细节 1. 第一步下载网页 2. 寻找和下载漫画图像 3. 保存图像&#xff0c;找到前⼀张漫画 六、完整代码 七、程序输出 八、附录 九、总结 一、背景介绍 XKCD网站是一个关于浪漫、隐喻、数字、以及…...

【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施

1. 背景 大模型(LLM)和多模态大模型(MLLM)利用基于Transformer的架构获得了很迅速的发展。为满足对这些模型的训练和轻量级微调需求&#xff0c;目前已有一些开源框架&#xff0c;如LLaMA-Factory、Firefly、FastChat、Axolotl和LMFlow等。但这些框架在支持的模型、技术和功能上…...

利用 schedule 模块在每日上午每 3 秒执行任务

一、schedule 模块基础原理与功能概述 schedule 模块维护了一个任务队列,每个任务都关联着一个特定的时间触发器和对应的执行函数。当系统时间到达任务设定的触发时间时,模块会从队列中取出相应的任务并执行其关联的函数。这种设 计模式使得开发者无需过多关注底层的时间处理…...

ruby超高级语法

以下是 Ruby 中一些 极度硬核 的语法和底层特性&#xff0c;涉及元编程的深渊、虚拟机原理、语法黑魔法等&#xff0c;适用于追求极限的 Ruby 开发者&#xff1a; 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def foo; "B…...

Java Stream API:现代化集合处理的艺术

Java Stream API:现代化集合处理的艺术 引言 在Java 8中引入的Stream API彻底改变了我们处理集合数据的方式。它不仅仅是一个新的工具集,更代表了一种声明式、函数式的编程范式。本文将深入探讨Java Stream的核心概念、使用场景和最佳实践。 一、什么是Stream? Stream(…...

ruby高级语法

以下是 Ruby 高级语法的详细总结&#xff0c;涵盖元编程、模式匹配、闭包、并发模型等核心主题&#xff1a; 一、元编程&#xff08;Metaprogramming&#xff09; 1. 动态定义方法 class DynamicClass# 使用 define_method 动态定义方法["foo", "bar"].e…...

特权FPGA之UART串口

0.简介 通用异步收发器(Universal Asynchronous Receiver&#xff0f;Transmitter&#xff0c;UART)可以和各种标准串行接口&#xff0c;如RS 232和RS 485等进行全双工异步通信&#xff0c;具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250&#xff0c;1645…...

oracle 索引失效

在 Oracle 11g 中&#xff0c;索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等&#xff0c;解决方法需结合版本特性&#xff08;如虚拟列、索引跳跃扫描&#xff09;。通过执行计划分析、统计信息维护和合理使用提示&#xff08;Hints&#xff09;&#xff0c…...

MySQL查看binlog执行情况

因数据丢失&#xff0c;被要求使用binlog查看 执行SQL的具体情况。 拿到数据库压缩包&#xff0c;解压缩获得文件和文件夹若干。 如图&#xff0c;有17个binlog文件&#xff0c;目标数据库名应为corr。 已知这个数据库是安装在windows下&#xff0c;版本8.0. 先下载一个mysq…...

kotlin,Android,jetpack compose,日期时间设置

AI生成&#xff0c;调试出来学习&#xff0c;这些小组件会用了&#xff0c;就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...

sql-labs靶场 less-2

文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…...

ssh密钥连接远程服务器并用scp传输文件

ssh密钥连接远程服务器 私钥的权限必须是600chmod 600 id_rsa连接时在命令中加上私钥的地址ssh -i PATH_to_id_rsa usernameip -p port scp -P port -i PATH_to_id_rsa file usernameip:PATH...

【锂电池SOH预测】PSO-BP锂电池健康状态预测,锂电池SOH预测(Matlab完整源码和数据)

预测效果 基于PSO-BP算法的锂电池健康状态预测研究 一、引言 1.1 研究背景与意义 在当今社会&#xff0c;锂电池凭借其高能量密度、长寿命及环境友好等特性&#xff0c;在现代能源系统中占据着举足轻重的地位。从消费电子领域如智能手机、笔记本电脑&#xff0c;到动力领域中…...

找搭子系统 搭子经济新风口 基于精准匹配的社交新生态探索

一、市场前景&#xff1a;为什么现在需要"找搭子"&#xff1f; 孤独经济爆发 超60%年轻人存在"精准陪伴"需求&#xff08;2024社交报告&#xff09; 传统社交App无法满足"非婚恋、非熟人"的中间态需求 线下活动复苏 剧本杀/飞盘等兴趣活动年增…...

《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》

前言 在数字化时代背景下&#xff0c;订单管理系统的高效性与灵活性成为企业竞争力的核心要素。本文档详细剖析了一个基于 策略模式 的度假订单导入系统&#xff0c;通过分层架构设计实现了多源异构数据的标准化处理。系统以 Spring Boot 为核心框架&#xff0c;结合 MyBatis …...

软件需求分析习题汇编

需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对&#xff08; &#xff09;的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生&#xff08; &#xff09; A. 项目开发…...

51单片机的汇编伪指令

目录 一、ORG 汇编起始地址命令 1、功能 2、语法格式 3、使用示例 4、注意事项 二、END 汇编终止命令 1、功能 2、语法格式 3、使用示例 4、注意事项 三、EQU 赋值命令 1、功能 2、语法格式 3、使用示例 4、注意事项 四、BIT 位定义命令 1、功能 2、语法格式…...

深入探究Python的re模块及其在爬虫中的应用

深入探究Python的re模块及其在爬虫中的应用 一、引言 在Python的强大生态系统中&#xff0c;re模块作为处理正则表达式的核心工具&#xff0c;发挥着举足轻重的作用。正则表达式是一种描述文本模式的强大语言&#xff0c;能够高效地进行字符串的匹配、查找、替换等操作。无论…...

aosp13增加摄像头控制功能实现

A13中&#xff0c;可以要求做一个开关来控制摄像头是否可用&#xff0c;约束所有使用摄像头的应用。思路&#xff1a;设置中增加开关设置一个属性值&#xff0c;在摄像头调用实现层增该值判断即可 一 开关的开发&#xff1a; 设置-安全中增加开关选项 代码部分&#x…...

Kotlin 之 vararg 参数向下传递的几种方式

在 Kotlin 中&#xff0c;vararg 参数是一种特殊的参数类型&#xff0c;用于表示可变数量的参数。vararg 参数是否可以向下传递&#xff0c;需要根据目标方法的参数类型来决定。 1、目标方法参数也是vararg类型&#xff0c;可直接向下传递 在 method 方法中&#xff0c;通过 …...

Kotlin学习

kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭&#xff0c;推荐几款开源的Kotlin的Android项目...

AI写程序:图片批量重命名工具 - 自动化整理您的图片库

图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工具&#xff0c;用于批量重命名文件夹中的图片文件。它能够递归处理选定文件夹及其所有子文件夹中的图片&#xff0c;按照…...

git命令自动拉去远程分支到本地

是的&#xff0c;可以通过 Git 命令自动拉取远程分支并在本地创建同名分支。以下是几种方法&#xff1a; 方法 1&#xff1a;直接拉取远程分支并创建同名本地分支 git fetch origin <远程分支名> # 拉取远程分支 git checkout -b <本地分支名> origin/<远程分…...

[创业之路-364]:穿透表象:企业投资的深层逻辑与误区规避

前言&#xff1a; 透过现象看本质 企业一生与人生相似 看企业如同看人 三岁看大&#xff0c;七岁看老 三十年河东&#xff0c;三十年河西 企业也有品行、文化、气质、性格、赚钱、生命周期与赚钱曲线 投资公司的目的是未来赚钱&#xff0c;赚未来赚钱。投资创业中的企业主要看…...

UE5 蓝图里的声音

文章目录 支持的格式设置循环播放在场景中放置音频设置音频的衰减与不衰减在UI动画中播放声音使用蓝图节点播放声音按钮本身就可以播放声音 支持的格式 支持&#xff1a;WAV 不支持&#xff1a;MP3 设置循环播放 双击音频&#xff0c;打开音频设置&#xff0c;勾选Looping …...

Spring Boot 邮件发送配置遇到的坑:解决 JavaMailSenderImpl 未找到的错误

在使用 Spring Boot 开发时&#xff0c;我们经常需要通过邮件发送功能来实现某些业务逻辑。为了方便快速集成&#xff0c;Spring Boot 提供了一个非常好用的 spring-boot-starter-mail 模块&#xff0c;帮助我们轻松发送邮件。但是&#xff0c;在配置过程中可能会遇到一些问题&…...

路由表的最终地址 root 路由跟踪,最终到哪里去

在路由跟踪(如tranceroute或trancert命令)中,最终地址是目标主机或服务器的IP地址或域名所对应的实际网络地址; 路由跟踪的目的是显示数据包从本地主机到目标主机所经过的每一跳路由器或网络节点,而最终地址是数据包要到达的目标设备。 1.路由跟踪的最终地址 目标主机:路…...

Docker面试全攻略(一):镜像打包、容器运行与高频问题解析

引言 在云原生和微服务架构盛行的今天,Docker 已成为后端开发的必备技能。本文从 面试高频考点 出发,系统梳理 Docker 镜像构建、容器运行的核心知识点,助你轻松应对 Docker 相关的技术面试! 一、Docker 镜像构建核心(面试必问) 1. Dockerfile 核心命令与参数 FROM:基…...

方法的重写

目录 1、重写的概念2、方法重写的规则3、重写 VS 重载 1、重写的概念 重写&#xff0c;也称为覆盖&#xff0c;是子类对父类的非构造、非静态、非 final 修饰、非 private 修饰的方法的实现过程的重新编写。重写可以让子类根据需要来实现父类的方法。方法重写是子类与父类的一…...

搭建hadoop集群模式并运行

3.1 Hadoop的运行模式 先去官方看一看Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster. 本地模式&#xff1a;数据直接存放在Linux的磁盘上&#xff0c;测试时偶尔用一下 伪分布式&#xff1a;数据存放在HDFS&#xff0c;公司资金不足的时候用 完全分布式&a…...

【学Rust写CAD】39 over_in_in 函数(alpha256补充方法)

源码 // Similar to over_in but includes an additional clip alpha value#[inline]pub fn over_in_in(self,src: Argb, dst: Argb, clip: Alpha) -> Argb {let src_alpha self * clip;let dst_alpha !(src_alpha*src.alpha_t());// we sum src and dst before reducing…...

Visual Studio 2022 UI机器学习训练模块

VS你还是太超标了&#xff0c;现在机器学习都不用写代码了吗&#xff01;&#xff01; 右键项目解决方案&#xff0c;选择机器学习模型...

c# 企业级ADB通信示例

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ADB_Demo {/// <summary>/// ADB管理器&#xff0c;提供与Android设备的通信功能/// </summary>publ…...

linux上todesk无法使用问题

安装 x11 查看是否已安装 X11 dpkg -l | grep xserver-xorg-core 安装 X11&#xff0c;大概需要 17 - 222 MB&#xff08;前者是在服务器上装&#xff0c;后者在自己的 WSL 装&#xff0c;具体视情况而定&#xff09; sudo apt-get install xorg sudo apt-get install xauth s…...

数字IC后端项目典型问题之后端实战项目问题记录

Q1:为了更高效过掉Calibre LVS&#xff0c;我们要求学员在chipfinish阶段需要先做Online LVS检查。该学员在做verifyConnectivity检查发现设计中存在大量的M1 VDD_CORE Un-Connect Pin的violation&#xff0c;具体violation如下图所示。 数字后端培训实战项目六大典型后端实现…...

【机器学习】决策树

一、什么是决策树&#xff1f; 想象一下你玩“二十个问题”游戏的场景&#xff0c;你通过问一系列“是”或“否”的问题来猜测对方心中的物体。决策树的工作方式与此非常相似。它本质上是一个流程图结构&#xff0c;其中&#xff1a; 每个内部节点&#xff08;Internal Node&…...

大模型格式化输出的几种方法

大模型格式化输出的几种方法 在开发一些和LLM相关的应用的时候,如何从大模型的反馈中拿到结构化的输出数据是非常重要的,那么本文就记录几种常用的方法。 OpenAI提供的新方法 在 OpenAI 的 Python 库中,client.beta.chat.completions.parse 是一个用于生成结构化输出的方法…...

250408_解决加载大量数据集速度过慢,耗时过长的问题

250408_解决加载Cifar10等大量数据集速度过慢&#xff0c;耗时过长的问题&#xff08;加载数据时多线程的坑&#xff09; 在做Cifar10图像分类任务时&#xff0c;发现每个step时间过长&#xff0c;且在资源管理器中查看显卡资源调用异常&#xff0c;主要表现为&#xff0c;显卡…...

Linux网络多进程并发服务器和多线程并发服务器

多进程 还是以大小写转换为例子 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/socket.h> #include <arpa/inet.h> #include "wrap.h" #include…...

LLMs基础学习(五)模型微调专题(中)

文章目录 LLMs基础学习&#xff08;五&#xff09;模型微调专题&#xff08;中&#xff09;Adapter 类的微调1 背景2 技术原理3 具体细节4 Adapter 类其他方法的微调 Prefix 类的微调1 Prefix Tuning2 Prompt Tuning3 P - tuning4 P - Tuning v25 总结 LoRA 篇a. 什么是 LoRA?…...

不同路由器网段之间的组建

实现PC1到PC7之间的通信 先将基础的ip都配置好 在AR6中将跳板配置好&#xff0c;ip route-static 192.168.5.0 24 64.1.1.2 在AR3中将跳板配置好&#xff0c;ip route-static 192.168.1.0 24 64.1.1.1 如此我们将可以实现通信了 还有第二种&#xff0c;实现PC1到…...

java设计模式-建造者模式

建造者模式(build) 建造者模式的四个角色 1、Product(产品角色)&#xff1a; 一个具体的产品对象。 2、Builder(抽象建造者)&#xff1a; 创建一个Product对象的各个部件指定的 接口或者抽象类。 3、ConcreteBuild(具体建造者)&#xff1a;实现接口&#xff0c;构建和装配各个部…...

【泛函分析】

E&#xff0e;Kreyszig, Introductory functional analysis with applications, Wiley, 1989 1.1 Metric space 满足下面四个性质的映射称为度量&#xff1a;正定、0、对称性和三角不等式 推论&#xff1a;广义的三角不等式 度量可以看成一个映射&#xff0c;验证欧式距离&am…...