zoukankan      html  css  js  c++  java
  • 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,那么,尽量不要用,呵呵。

    回到目录

  • 相关阅读:
    shader之渐变长方体实现(threejs)
    shader之threejs应用
    shader之cesium应用
    pip install -- Failed building wheel for XXX
    pycharm -- 界面乱码
    Android Studio -- 优化速度
    django -- ImageField 上传图片修改头像
    AI -- 回溯法解决四皇后问题
    Android Studio -- 真机测试
    傻瓜函数式编程
  • 原文地址:https://www.cnblogs.com/lori/p/3305665.html
Copyright © 2011-2022 走看看