與其它ORM框架相比,XCode擁有最強(qiáng)的多數(shù)據(jù)庫正向反向工程,暫時(shí)還沒有發(fā)現(xiàn)能在這點(diǎn)上超于XCode的,哈哈!
但是,XCode的多數(shù)據(jù)庫反向工程,也是有代價(jià)的,不同數(shù)據(jù)庫的數(shù)據(jù)類型相差十萬八千里,我們不可能完全支持。
所以,我們只做了常見的一些數(shù)據(jù)類型支持,但是這些已經(jīng)足以滿足99%的要求。
最佳數(shù)據(jù)類型如下:
1,整型。Int32是標(biāo)準(zhǔn)配置,這個(gè)必須有的。在Oracle,整型就是小數(shù)為0的Numeric
2,長整型。Int64,大部分?jǐn)?shù)據(jù)庫都有吧。
3,短整型。Int16,這個(gè)要小心了,似乎有些數(shù)據(jù)庫不支持,不支持時(shí)XCode會(huì)自動(dòng)選Int32,兄弟就不要省這點(diǎn)存儲(chǔ)空間啦。
4,布爾型。Boolean,大部分?jǐn)?shù)據(jù)庫支持,MySql不支持,它一般用一個(gè)枚舉Y/N來實(shí)現(xiàn),XCode有支持。
5,浮點(diǎn)數(shù)。單精度Fload雙精度Double,建議一律用Double,否則不同數(shù)據(jù)庫很難統(tǒng)一,還有千萬小心精度設(shè)置和小數(shù)位數(shù),XCode反向工程可能不能把精度和小數(shù)位數(shù)完美的遷移到其它類型數(shù)據(jù)庫,同類型沒有問題。
6,貨幣。Decimal,貨幣類型必須有的,對(duì)應(yīng)MSSQL的Money。開發(fā)的時(shí)候小心,不要拿Decimal判斷兩個(gè)值是否相等,應(yīng)該相減判斷差值是否小于0.000001,這個(gè)小數(shù)自己看情況定。
7,時(shí)間日期。DateTime,各種數(shù)據(jù)庫,一律用時(shí)間日期DateTime,不支持單獨(dú)的Date或Time的遷移。這個(gè)類型是XCode里面最為痛苦的一個(gè)類型,單獨(dú)的Date和Time根本無法實(shí)現(xiàn)不同類型數(shù)據(jù)庫的兼容。
8,字符串。String,在MSSQL一律用nvarchar,Unicode變長。字符串類型是唯一完整支持不同數(shù)據(jù)庫設(shè)置長度的,以上類型全部不能完整支持。
9,大文本。String,在MSSQL一律用ntext。在.Net中同為String,根據(jù)不同數(shù)據(jù)庫的字符串最大長度(MSSQL是4000),識(shí)別為nvarchar還是ntext。
最佳體驗(yàn):
1,單一主鍵,建議用自增ID。XCode支持遷移自增字段的數(shù)據(jù),當(dāng)然,如果需要合并數(shù)據(jù),那得自己處理邏輯
2,建立各種索引。
最差體驗(yàn):
0,零號(hào)是最最最糟糕的,XCode不支持可空類型,所以千萬不要讓null和“”有不同的業(yè)務(wù)意義,各種類型的默認(rèn)值代表無效數(shù)據(jù)。
1,除了字符串長度外,其它類型絕對(duì)絕對(duì),盡可能的不要設(shè)置其它屬性,包括長度、精度、小數(shù)位數(shù),否則XCode不能實(shí)現(xiàn)完美遷移
2,XCode目前不支持各種數(shù)據(jù)庫的外鍵。新增的表間關(guān)系是通過猜測(cè)得到的,規(guī)則:字段名等于另一個(gè)表名加主鍵名時(shí),認(rèn)為是外鍵
3,不要用Guid類型和二進(jìn)制類型,XCode只能支持正向工程,不能支持它們的反向工程。可用nvarchar(32)替代Guid
4,字符串盡量不要用varchar/char等,因?yàn)椴煌瑪?shù)據(jù)庫甚至相同數(shù)據(jù)庫的不同版本,差別好大。這樣省不了多少空間。
5,盡可能的不要用默認(rèn)值。目前只有當(dāng)前時(shí)間默認(rèn)值支持好一點(diǎn),newid()也有簡(jiǎn)單的支持,這塊太痛苦了,也許將來不支持了。
XCode內(nèi)部沒有類型映射表,別亂猜測(cè)!!
ADO.Net的架構(gòu)里面有一個(gè)DataTypes的模式,XCode利用的正是它,所以,什么字段類型對(duì)應(yīng)什么.Net類型,是各種數(shù)據(jù)庫驅(qū)動(dòng)自身說了算,不是XCode說了算,所以我們也不知道所有類型是否支持。
反正這么多年,我們占用這些類型,就已經(jīng)足夠了。