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

回到目錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM