FreeSql 插入数据,如何返回自增值
FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。
以 MIT 开源协议托管于 github:https://github.com/2881099/FreeSql
FreeSql 插入数据的方式有多种,这篇文章教你用最优的方案做数据插入功能。
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=db1.db")
.UseAutoSyncStructure(true) //自动同步实体结构到数据库
.Build(); //请务必定义成 Singleton 单例模式
public class Blog
{
[Column(IsIdentity = true, IsPrimary = true)]
public int BlogId { get; set; }
public string Url { get; set; }
public int Rating { get; set; }
}
var blog = new Blog
{
Url = "https://github.com/2881099/FreeSql",
Rating = 5
};
单条数据插入
如果表有自增列,插入数据后应该要返回 id。
方法1:(原始)
long id = fsql.Insert(blog).ExecuteIdentity();
blog.Id = id;
方法2:(依赖 FreeSql.Repository)
var repo = fsql.GetRepository<Blog>();
repo.Insert(blog);
将插入后的自增值,填充给 blog.Id
方法3:(依赖 FreeSql.DbContext)
using (var ctx = fsql.CreateDbContext())
{
ctx.Add(blog);
ctx.SaveChanges();
}
将插入后的自增值,填充给 blog.Id
批量插入
var items = new List<Topic>();
for (var a = 0; a < 10; a++)
{
items.Add(new Blog
{
Url = "https://github.com/2881099/FreeSql",
Rating = 5
});
}
方法1:(原始)
fsql.Insert(items).ExecuteAffrows();
无法返回 items 所有 id 值
方法2:(依赖 FreeSql.Repository)
var repo = fsql.GetRepository<Blog>();
repo.Insert(items);
将插入后的自增值,填充给所有 items.Id
当操作的是 SqlServer/PostgreSql 数据库,此方法为一次执行,返回所有 id
当操作的是其他数据库,此方法为循环多次执行,返回所有 id(注意性能问题)
大批量插入(SqlBulkCopy、BulkCopy)
针对 SqlServer/PostgreSQL/MySql 数据库,目前能在以下实现使用:
- FreeSql.Provider.SqlServer
- FreeSql.Provider.PostgreSQL
- FreeSql.Provider.MySqlConnector
fsql.Insert(items).ExecuteSqlBulkCopy();
fsql.Insert(items).ExecutePgCopy();
fsql.Insert(items).ExecuteMySqlBulkCopy();
另外 IInsert 方法提供了 ToDataTable() 方法返回 DataTable 对象,让使用者自己封装 BulkCopy 操作。
DataTable dt = fsql.Insert(items)
.InsertIdentity() //开启自增 id 插入
.ToDataTable();
注意:InsertIdentity() 的功能是生成 SQL 的时候有值,而不是调用 SET IDENTITY ON;
参考资料
《新人学习指引》 | 《Select》 | 《Update》 | 《Insert》 | 《Delete》 | |
《表达式函数》 | 《CodeFirst》 | 《DbFirst》 | 《BaseEntity》 | |
《Repository》 | 《UnitOfWork》 | 《过滤器》 | 《乐观锁》 | 《DbContext》 | |
《读写分离》 | 《分区分表》 | 《租户》 | 《AOP》 | 《黑科技》 | 更新日志 |
FreeSql 插入数据,如何返回自增值的更多相关文章
- Mybatis在oracle数据库中插入数据后返回自增值ID
1.将id设置成自增序列 CREATE OR REPLACE TRIGGER "DATALIB"."TRIG_USER_ADD" BEFORE INSERT O ...
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- 用注解的方式实现Mybatis插入数据时返回自增的主键Id
一.背景 我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键.这个id也会关联到其它表的外键. 这就要求往表中插入数据时能返回表的自增id,用这个ID去给关联表的字段赋值.下面讲一 ...
- 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据
第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mybatis插入数据后返回自增主键ID详解
1.场景介绍: 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...
- mybatis 插入数据时返回主键
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...
- mysql插入数据后返回自增ID的方法
mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用la ...
- mysql 插入数据后返回当前的自增ID方法
存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ...
随机推荐
- 传输层TCP和UDP
TCP协议 传输控制协议 TCP是面向连接.可靠的进程到进程通信的协议 TCP提供全双工工服务,即数据可在同一时间双向传输 三次握手: ...
- 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析
8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析. 什么是处理误差 (treatment error).组间误差(between ...
- Listening-lecture|主旨题|术语解释|举例原则|Crash course 哔哩哔哩
Listening-lecture: Major topic: SP1---detail---detail---detail SP2---detail---detail---detail Crash ...
- VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】
VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.vb这个默认文件中. 大家可以在Visual Studio中创建 ...
- git理论知识
1.Git 有三种状态,你的文件可能处于其中之一:已提交(committed).已修改(modified)和已暂存(staged) 由此引入 Git 项目的三个工作区域的概念:Git 仓库.工作目录以 ...
- 吴裕雄--天生自然python学习笔记:编写网络爬虫代码获取指定网站的图片
我们经常会在网上搜索井下载图片,然而一张一张地下载就太麻烦了,本案例 就是通过网络爬虫技术, 一次性下载该网站所有的图片并保存 . 网站图片下载并保存 将指定网站的 .jpg 和 .png 格式的图片 ...
- java170道面试题汇总+详细解析
2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...
- JS做深度学习3——数据结构
最近在上海上班了,很久没有写博客了,闲下来继续关注和研究Tensorflow.js 关于深度学习的文章我也已经写了不少,部分早期作品可能包含了不少错误的认识,在后面的博文中会改进或重新审视. 今天聊聊 ...
- Android开发之《内存对齐》
为什么要进行内存对齐以及对齐规则:http://www.cnblogs.com/jijiji/p/4854581.html 1. 在32位系统中定义变量最好用int,因为这样效率高.原因就在于32位的 ...
- MyBatis学习总结之一对多映射
1.首先创建2张表:students 和grades create table grades( gid ) primary key, gname varchar() ); create table s ...