在設計表結構時,我們通常將不是很在乎表現的主鍵設計成自增長的,大數據量用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,那么,盡量不要用,呵呵。
