EF架构~为BulkInsert引入SET IDENTITY_INSERT ON功能
在设计表结构时,我们通常将不是很在乎表现的主键设计成自增长的,大数据量用bigint,一般地用int就可以了,int就是C#里的Int32,它最大可以存储到2147483647,21亿,基本可以满足大多数的要求了,呵呵。
对于自增长主键来说,导数据是个比较麻烦的事,使用SQLSERVER还可以,你把自增去了,再进行SQL专入即可,但如果导数据这个动作是作到程序里,那可就有点麻烦了,一般地,我们为自增主键数据表导数据时,有两个方式,一是去掉自增长特性,二是使用SQL提交的SET IDENTITY_INSERT [table] ON/OFF,如果你的导数据动作是在程序里完成的,那就只能使用后者了,没人愿意总是去手动改数据表结构,呵呵。
下面是我将我的架构又完善了一下,为BulkInsert方法重构了一个 BulkInsert(IEnumerable<TEntity> item, bool isRemoveIdentity),即在批量插入数据时,可以选择是否关闭自增特性,而手动为主键赋值的方式,这个对于有些导数据的场合非常重要。
看我的代码吧:
public void BulkInsert(IEnumerable<TEntity> item, bool isRemoveIdentity) { string startTag = "", endTag = ""; if (isRemoveIdentity) { startTag = "SET IDENTITY_INSERT " + typeof(TEntity).Name + " ON;"; endTag = "SET IDENTITY_INSERT " + typeof(TEntity).Name + " OFF;"; } DataPageProcess(item, (currentItems) => { _Db.Database.Connection.Open(); ((IObjectContextAdapter)_Db).ObjectContext.CommandTimeout = 0;//永不超时 _Db.Database.ExecuteSqlCommand(startTag + DoSQL(currentItems, SQLType.Insert) + endTag); }); }
注意:这里的SET IDENTITY_INSERT ON必须和你的SQL语句写在一起,这样它对于SQL来说才是一个会话,如果有在一个会话里,你的SET IDENTITY_INSERT ON才有意思,网上不少朋友提倡使用TransactionScope,这一点我只有一个建议,就是如果你的事务有可能提升为MSDTC,那么,尽量不要用,呵呵。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2012-09-06 IoC~MVC3+EF+Autofac实现松耦合的系统架构