FreeSql学习笔记——2.插入
前言
由于还没有表结构,就先从新增开始,插入一些数据后才好做查询、修改、删除操作。
初始化
前面注入FreeSql时设置过自动同步表结构,那么就不用管数据库了,只需要在项目中定义实体,就会自动生成表结构,这里创建一个学生类Student
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | /// <summary> /// 学生 /// </summary> [Table(Name = "Student" )] public class Student { /// <summary> /// 自增主键 /// </summary> [Column(IsIdentity = true , IsPrimary = true )] public long Id { get ; set ; } /// <summary> /// 姓名 /// </summary> [Column(IsNullable = false , DbType = "varchar(20)" )] public string Name { get ; set ; } /// <summary> /// 年龄 /// </summary> public int Age { get ; set ; } public StatusEnum Status { get ; set ; } /// <summary> /// 添加时间 /// </summary> public DateTime AddTime { get ; set ; } /// <summary> /// 说明 /// </summary> [Column(IsNullable = true ,DbType = "varchar(100)" )] public string Remark { get ; set ; } } /// <summary> /// 状态枚举 1.正常 2.冻结 /// </summary> public enum StatusEnum {<br> Normal = 1, Freeze = 2 } |
有了实体后新增个接口用于插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [HttpGet( "AddStudent" )] public async Task<ActionResult> AddStudent() { var student = new Student { Name = "小明" , Age = 8, Status = StatusEnum.Normal, AddTime = DateTime.Now }; var res = await _freeSql.Insert<Student>().AppendData(student).ExecuteInsertedAsync(); return Ok(); } |
批量插入
批量插入可以使用ExecuteAffrows()、ExecuteSqlBulkCopy()方法,BulkCopy操作是扩展方法,可用的数据库有SqlServer/PostgreSQL/MySql,大批量插入使用BulkCopy更快
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var studentList = new List<Student>(); for ( int i = 0; i < 10; i++) { studentList.Add( new Student { Name = "小明" + i, Age = i, Status = StatusEnum.Normal, AddTime = DateTime.Now }); } //await _freeSql.Insert(studentList).ExecuteSqlBulkCopyAsync(); var res = await _freeSql.Insert(studentList).ExecuteAffrowsAsync(); return Ok(); |
插入指定列、忽略列
正常情况下不指定列、不忽略列,将实体所有的字段插入数据库
插入指定列就是指定字段插入,未指定的列不生成sql
忽略列指定某一些字段不插入,与指定列相反
忽略列和指定列同时设置同一字段以优先级为准
插入的优先级:
全部列 < 指定列(InsertColumns)< 忽略列(IgnoreColumns)
1 2 3 4 5 6 7 8 9 | _freeSql.Insert(student1).ExecuteAffrowsAsync(); //正常插入 _freeSql.Insert(student2) .InsertColumns(x => new { x.Name, x.Age, x.Status, x.AddTime }) .ExecuteAffrowsAsync(); //指定列 //等价于 _freeSql.Insert(student2) .IgnoreColumns(x => x.Remark) .ExecuteAffrowsAsync(); //忽略列 |
字典插入
直接使用字典插入,无需使用实体
1 2 3 4 5 6 7 | var dic = new Dictionary< string , object >(); dic.Add( "Name" , "Dic" ); dic.Add( "Age" , 1); dic.Add( "Status" , StatusEnum.Normal); dic.Add( "AddTime" , DateTime.Now); _freeSql.InsertDict(dic).AsTable(nameof(Student)).ExecuteAffrowsAsync(); |
就插入数据而言,使用的较多的还是单个实体插入(第一种方式),如果是大批量插入建议使用BulkCopy,官方提供的插入方式还有导入表数据、Mysql特有的功能,有需要的同学可以了解下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现