FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。

以 MIT 开源协议托管于 github:https://github.com/2881099/FreeSql

FreeSql 插入数据的方式有多种,这篇文章教你用最优的方案做数据插入功能。

  1. static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
  2. .UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=db1.db")
  3. .UseAutoSyncStructure(true) //自动同步实体结构到数据库
  4. .Build(); //请务必定义成 Singleton 单例模式
  5. public class Blog
  6. {
  7. [Column(IsIdentity = true, IsPrimary = true)]
  8. public int BlogId { get; set; }
  9. public string Url { get; set; }
  10. public int Rating { get; set; }
  11. }
  12. var blog = new Blog
  13. {
  14. Url = "https://github.com/2881099/FreeSql",
  15. Rating = 5
  16. };

单条数据插入

如果表有自增列,插入数据后应该要返回 id。

方法1:(原始)

  1. long id = fsql.Insert(blog).ExecuteIdentity();
  2. blog.Id = id;

方法2:(依赖 FreeSql.Repository)

  1. var repo = fsql.GetRepository<Blog>();
  2. repo.Insert(blog);

将插入后的自增值,填充给 blog.Id

方法3:(依赖 FreeSql.DbContext)

  1. using (var ctx = fsql.CreateDbContext())
  2. {
  3. ctx.Add(blog);
  4. ctx.SaveChanges();
  5. }

将插入后的自增值,填充给 blog.Id

批量插入

  1. var items = new List<Topic>();
  2. for (var a = 0; a < 10; a++)
  3. {
  4. items.Add(new Blog
  5. {
  6. Url = "https://github.com/2881099/FreeSql",
  7. Rating = 5
  8. });
  9. }

方法1:(原始)

  1. fsql.Insert(items).ExecuteAffrows();

无法返回 items 所有 id 值

方法2:(依赖 FreeSql.Repository)

  1. var repo = fsql.GetRepository<Blog>();
  2. repo.Insert(items);

将插入后的自增值,填充给所有 items.Id

当操作的是 SqlServer/PostgreSql 数据库,此方法为一次执行,返回所有 id

当操作的是其他数据库,此方法为循环多次执行,返回所有 id(注意性能问题)

大批量插入(SqlBulkCopy、BulkCopy)

针对 SqlServer/PostgreSQL/MySql 数据库,目前能在以下实现使用:

  • FreeSql.Provider.SqlServer
  • FreeSql.Provider.PostgreSQL
  • FreeSql.Provider.MySqlConnector
  1. fsql.Insert(items).ExecuteSqlBulkCopy();
  2. fsql.Insert(items).ExecutePgCopy();
  3. fsql.Insert(items).ExecuteMySqlBulkCopy();

另外 IInsert 方法提供了 ToDataTable() 方法返回 DataTable 对象,让使用者自己封装 BulkCopy 操作。

  1. DataTable dt = fsql.Insert(items)
  2. .InsertIdentity() //开启自增 id 插入
  3. .ToDataTable();

注意:InsertIdentity() 的功能是生成 SQL 的时候有值,而不是调用 SET IDENTITY ON;

参考资料

《新人学习指引》 | 《Select》 | 《Update》 | 《Insert》 | 《Delete》
《表达式函数》 | 《CodeFirst》 | 《DbFirst》 | 《BaseEntity》
《Repository》 | 《UnitOfWork》 | 《过滤器》 | 《乐观锁》 | 《DbContext》
《读写分离》 | 《分区分表》 | 《租户》 | 《AOP》 | 《黑科技》 | 更新日志

FreeSql 插入数据,如何返回自增值的更多相关文章

  1. Mybatis在oracle数据库中插入数据后返回自增值ID

    1.将id设置成自增序列 CREATE OR REPLACE TRIGGER "DATALIB"."TRIG_USER_ADD" BEFORE INSERT O ...

  2. mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  3. 用注解的方式实现Mybatis插入数据时返回自增的主键Id

    一.背景 我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键.这个id也会关联到其它表的外键. 这就要求往表中插入数据时能返回表的自增id,用这个ID去给关联表的字段赋值.下面讲一 ...

  4. 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

    第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...

  5. mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  6. mybatis插入数据后返回自增主键ID详解

    1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...

  7. mybatis 插入数据时返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:显然,假如主键是你生成后插入的,自然你已经有主键了,显然不需要我们再去获得,所以我们这里处理的是当主键 ...

  8. mysql插入数据后返回自增ID的方法

    mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用la ...

  9. mysql 插入数据后返回当前的自增ID方法

    存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ...

随机推荐

  1. python之接口开发

    一.接口开发的思路 1.启动一个服务: 2.接受客户端传过来的数据: 3.登录,注册,支付等功能 4.操作数据库,拿到数据: 5.返回数据: import flask server=flask.Fla ...

  2. 【转】HeadFirst 组合模式+迭代器错误原因以及解决代码

    http://blog.csdn.net/sugar_girl/article/details/53400267     <HeadFirst JAVA设计模式>中用迭代器迭代组合模式是存 ...

  3. 103)PHP,递归读取目录内容

    知识点总结: 打开某个目录 依次读取目录内文件 如果某个文件为目录 递归对该目录采用打开,读取,若还是目录,继续判断,读取 递归点: 如果子文件为目录,则递归 出口: 如果目录中不存在子目录,则不需要 ...

  4. vue element 关闭当前tab 跳转到上一路由

    方法一 this.$store.dispatch('delVisitedViews', this.$route); this.$router.go(-1); 方法二 this.$store.state ...

  5. setContext or setCharacterEncoding

    request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值response.setContentType("text/html;char ...

  6. leetCode-nSum

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  7. 吴裕雄--天生自然 R语言开发学习:重抽样与自助法(续一)

    #-------------------------------------------------------------------------# # R in Action (2nd ed): ...

  8. xampp安装后启动apache出现端口占用问题

    apache默认监听电脑80端口,当端口被占用时,xampp无法正常启动apache.我们需要将端口解除占用再启动. xampp报错: Problem detected!19:36:24 [Apach ...

  9. PyCharm 介绍、安装、入门使用

    一.Pycharm介绍 前面几年的时间,我一直用的eclipse,后面开始听同事说用IntelliJ IDEA了,而且说是目前业界最好用的java开发工具,IDE(集成开发环境),没有之一.PyCha ...

  10. javascript学习内容

    http协议 犀牛书 MDN js单线程 let只在代码块内有效 es5只有全局作用域 const变量指向的内存地址不得改动,值不能保证不变 全局变量不加var node.js 更改连接到服务器的方式 ...