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》 | 《黑科技》 | 更新日志 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端