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,那么,尽量不要用,呵呵。

    回到目录

  • 相关阅读:
    大道至简读后感
    机器学习十讲(一)
    第一个TensorFlow的简单例子
    初识深度学习
    如何使用本地的Navicat连接服务器中的Mysql
    阿里云ECS-安装Tomcat
    阿里云ECS-CentOS 8上安装MySQL 8.0
    阿里云ECS--CentOS8安装jdk1.8
    进度报告十(重大技术需求)
    进度报告九 (重大技术需求调研)
  • 原文地址:https://www.cnblogs.com/lori/p/3305665.html
Copyright © 2011-2022 走看看