實現ORM的四種方案

2021-08-23 11:43:27 字數 2451 閱讀 2772

正如orm名稱所指示的,實現orm的關鍵點在於解決「物件--關係」之間的對映,例如,如何將乙個datarow轉換為乙個entity object,又如何將乙個對某entity object的操作對映到乙個idbcommand,等等。我們以datarabbit為例,

public

inte***ce

<

tentity

>

1.**生成器

2.反射

將乙個datarow轉換為乙個entity object,如果粒度更細一點,我們實際要解決的是如何將datarow的一列的值賦值給entity object對應的屬性,我們可以使用反射在執行時給entity object的屬性賦值,如:

entitytype.invokemember(columnname,bindingflags.public

|bindingflags.ignorecase

|bindingflags.instance

|bindingflags.setproperty,

null

,entity,row[columnname]);

這行**的含義是將row中【columnname】列的值賦值給entity物件的【columnname】屬性。

3.emit

private

void

emitgetentityfrommethod(typebuildertypebuilder,methodinfobasemethod,typeentitytype,dataschemadataschema)

));ilgenerator.emit(opcodes.stloc_0);

//member=newmember();

ilist

<

propertyinfo

>

bloblist

=new

list

<

propertyinfo

>

();#region

為非blob屬性賦值

foreach

(propertyinfoproperty

inentitytype.getproperties())

if((property.propertytype

==typeof

(byte

))&&(!

columnschema.istimestamp))

emitsetproperty(entitytype,ilgenerator,property);

}#endregion

if(bloblist.count

>0)

#endregion

}ilgenerator.marklabel(retlabel);

ilgenerator.emit(opcodes.nop);

ilgenerator.emit(opcodes.ldloc_0);

ilgenerator.emit(opcodes.ret);

typebuilder.definemethodoverride(methodbuilder,basemethod);

//定義方法過載}

4.使用lamda表示式

如果是在.net3.5上,我們可以使用動態生成的lamda表示式來完成entity object屬性的賦值操作,關鍵點是要如何生成用於賦值的動態委託。比如:

private

action

<

tentity,

object

>

createfunctionofsetproperty

<

tentity

>

(methodinfosetpropertymethod,typecolumntype);}

這個方法返回乙個委託,返回的委託接收兩個引數--entity object 和要賦的屬性值,呼叫這個委託便可以為entity object的某個屬性進行賦值。

好了,四種方案已經簡單介紹完畢,下面我們來比較一下。

(1)除了第一種方案是在編譯期完成外,後面三種方案都是在執行期完成的。

(2)第一種方案的效率是最高的,但是所需的手工操作也是最多的(比如每次修改了表結構都需要重新生成dal層)。第二種方案的效率是最低的,反射使效率的折損非常之大。後兩種方案的效率都不錯(幾乎接近第一種方案)。

(3)emit方案的實現難度應當是最大的,其次是lamda表示式方案。

(4)lamda表示式方案在.net3.5及以上平台才可使用。

datarabbit 3.x及之前版本採用的是emit方案,後續的4.0及以上版本則對emit方案和lamda表示式方案都支援(預設為emit方案,可以修改配置選項使之採用lamda表示式方案)。

Hadoop MongoDB的四種方案

背景 公司核心業務庫現存在mongodb中,分布在6臺mongodb節點。現面臨如下問題 1.最大的一張表有10多個g,mongodb在查詢方面尚能勝任,但是涉及到複雜計算時會比較吃力。2.mongodb中有三張表,分別記錄了終端使用者在三個不同系統 遊戲,桌牌等 的行為,需要按使用者匯聚成一張表。...

四種CDC方案比較

抽取處理需要重點考慮增量抽取,也被稱為變化資料捕獲,簡稱cdc。假設乙個資料倉儲系統,在每天夜裡的業務低峰時間從操作型源系統抽取資料,那麼增量抽取只需要過去24小時內發生變化的資料。變化資料捕獲也是建立準實時資料倉儲的關鍵技術。當你能夠識別並獲得最近發生變化的資料時,抽取及其後面的轉換 裝載操作顯然...

CSS四種方案實現 居中布局

不定寬元素的居中對齊 方案一 text align center display inline block css html demo 效果 優點 1.相容性好,相容ie 6 7只需對元素 display 屬性修改為 inline 缺點 child 會繼承 parent 的text align ce...