亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

代碼生成模式的制作方法

文檔序號:6607212閱讀:136來源:國知局

專利名稱::代碼生成模式的制作方法代碼生成模式本申請是國際申請?zhí)枮镻CT/US2006/025390,國際申請日為2006年6月29日,進入中國國家階段的申請?zhí)枮椤?00680027771.3”,發(fā)明名稱為“代碼生成模式”的發(fā)明專利申請的分案申請。
背景技術(shù)
:由于存儲器和處理能力的持續(xù)增長,代碼生成成為了增加程序員生產(chǎn)力的流行方法。近年來,代碼生成器的流行度增長了。代碼生成器自動生成源級語言代碼(例如,C、c#>VisualBasic,Java...)0使用自動生成的代碼可減少開發(fā)時間并增加代碼的穩(wěn)定性。具體地,代碼生成在對象關(guān)系映射(ORM)上下文中變得流行。關(guān)系數(shù)據(jù)存儲系統(tǒng)(例如,DB2、SQLServer,MySQL)被用來存儲關(guān)系數(shù)據(jù)并管理其關(guān)系。用源級語言開發(fā)的軟件訪問并操縱存儲在關(guān)系數(shù)據(jù)存儲系統(tǒng)中的關(guān)系數(shù)據(jù)是有益的。當應(yīng)用程序軟件正管理關(guān)系數(shù)據(jù)時,它應(yīng)維護數(shù)據(jù)中固有的關(guān)系。另外,對關(guān)系數(shù)據(jù)的任何改變或修改應(yīng)被存回關(guān)系數(shù)據(jù)存儲系統(tǒng)。
發(fā)明內(nèi)容以下呈現(xiàn)了簡化的概述以便于提供對所要求保護的主題的某些方面的基本理解。該概述不是詳盡的概觀。它不旨在標識關(guān)鍵/重要的元素也不描繪所要求保護的主題的范圍。其唯一目的是以簡化形式呈現(xiàn)某些概念作為稍后呈現(xiàn)的更詳細描述的序言。簡而言之,所提供的主題涉及計算機生成源。更具體地,本主題涉及與在管理數(shù)據(jù)關(guān)系同時將關(guān)系數(shù)據(jù)映射到對象模型相關(guān)的機器生成的源代碼。描述了在數(shù)據(jù)對象之間提供雙向關(guān)系的代碼生成模式。生成的對象模型可支持從數(shù)據(jù)存儲系統(tǒng)中按需(on-demand)或延期的關(guān)系數(shù)據(jù)加載。對象模型可利用通用類型來創(chuàng)建對應(yīng)于數(shù)據(jù)存儲系統(tǒng)數(shù)據(jù)表的一組數(shù)據(jù)表。這允許數(shù)據(jù)存儲系統(tǒng)被表示成包含用于映射到對象模型的每一數(shù)據(jù)存儲系統(tǒng)數(shù)據(jù)表的數(shù)據(jù)表的類。對象模型也能夠檢測并跟蹤從數(shù)據(jù)存儲系統(tǒng)中采集的對數(shù)據(jù)的改變。該系統(tǒng)提供標識更新數(shù)據(jù)并防止對經(jīng)修改的數(shù)據(jù)存儲系統(tǒng)數(shù)據(jù)重寫的高效方法。另外,提供默認成員修改器。默認修改器向開發(fā)員提供在不直接修改源代碼的情況下覆蓋工具生成的源代碼的能力。為了實現(xiàn)前述和相關(guān)目的,此處結(jié)合以下描述和附圖描述了所要求保護的主題的某些說明性方面。這些方面指示可實現(xiàn)本主題的各種方式,它們均旨在落在所要求保護的主題的范圍之內(nèi)。當結(jié)合附圖考慮以下詳細描述時,其他優(yōu)點和新穎的特征將是顯而易見的。圖1是用于工具生成源代碼的編譯系統(tǒng)的框圖。圖2是用于處理默認類成員的方法的流程圖。圖3是ORM系統(tǒng)的框圖。圖4是示出顧客定單關(guān)系的框圖。圖5是用于將數(shù)據(jù)對象添加到容器而同時維護數(shù)據(jù)對象關(guān)系的方法的流程圖。圖6是用于從容器中移除數(shù)據(jù)對象而同時維護數(shù)據(jù)對象關(guān)系的方法的流程圖。圖7是用于添加或移除數(shù)據(jù)對象引用而同時管理數(shù)據(jù)對象關(guān)系的方法的流程圖。圖8是示出用于為ORM系統(tǒng)執(zhí)行延期加載的方法的流程圖。圖9是示出用于創(chuàng)建對應(yīng)于數(shù)據(jù)存儲系統(tǒng)表的一組數(shù)據(jù)對象表的方法的流程圖。圖10是示出用于跟蹤經(jīng)修改的對象的方法的流程圖。圖11是示出用于將對關(guān)系數(shù)據(jù)的修改存到數(shù)據(jù)存儲系統(tǒng)的方法的流程圖。圖12是示出合適的操作環(huán)境的示意性框圖。圖13是示例計算環(huán)境的示意性框圖。具體實施例方式現(xiàn)在參考附圖描述所要求保護的主題的各方面,在全部附圖中,同樣的參考標號指的是相同或相應(yīng)的元素。然而,應(yīng)該理解,附圖及其涉及的詳細描述不旨在將所要求保護的主題限制于所公開的具體形式。相反,意圖是覆蓋落入所要求保護的主題的精神和范圍內(nèi)的所有修改、等效方式和替換方式。如此處所使用的,術(shù)語“組件”和“系統(tǒng)”等指的是計算機相關(guān)的實體,或者是硬件、硬件和軟件的組合、軟件或者是執(zhí)行中的軟件。例如,組件可以是,但不限于,運行在處理器上的進程、處理器、對象、可執(zhí)行代碼、執(zhí)行的線程、程序和/或計算機。作為說明,運行在計算機上的應(yīng)用程序和計算機本身均可以是組件。一個或多個組件可以駐留在進程和/或執(zhí)行中的線程內(nèi),且組件可以位于一臺計算機上和/或分布在兩臺或多臺計算機之間。詞語“示例性”此處被用來意味著用作示例、實例或說明。此處描述為“示例性”的任何方面和設(shè)計不必解釋為較其它方面或設(shè)計更優(yōu)選和有利。另外,盡管所提供的示例利用了C#程序設(shè)計語言,但可使用眾多替換的程序設(shè)計語言。此外,所公開的主題可被實現(xiàn)為系統(tǒng)、方法、裝置或制品,它們使用標準程序設(shè)計和/或工程技術(shù)來生產(chǎn)軟件、固件、硬件或其任何組合,以控制基于計算機或處理器的設(shè)備來實現(xiàn)此處詳細描述的各方面。如此處所用的術(shù)語“制品”(或“計算機程序產(chǎn)品”)旨在包含可從任何計算機可讀設(shè)備、載波或介質(zhì)訪問的計算機程序。例如,計算機可讀介質(zhì)可包括,但不限于,磁存儲設(shè)備(例如,硬盤、軟盤、磁條…)、光盤(例如,緊致盤(CD)、數(shù)字多功能盤(DVD)…)、智能卡和閃存設(shè)備(例如,卡、棒)。另外,應(yīng)該理解,可使用載波來攜帶計算機可讀電子數(shù)據(jù),諸如在發(fā)送和接收電子郵件或訪問諸如因特網(wǎng)或局域網(wǎng)(LAN)等網(wǎng)絡(luò)中所使用的那些。當然,本領(lǐng)域的技術(shù)人員可以認識到,可以對此配置進行多種修改,而不背離所要求保護的主題的范圍或精神。I.默認成員修改器現(xiàn)在參考圖1,一般而言,程序員使用代碼生成工具或源代碼生成器來為程序產(chǎn)生初始結(jié)構(gòu)然后修改生成的源代碼。然而,如果在軟件開發(fā)期間有必要再次生成代碼,則開發(fā)員對生成的代碼的改變將被重寫。因此,開發(fā)員可創(chuàng)建單獨的源代碼文件。某些源級語言便于使用單獨的源文件來對生成的代碼進行修改。例如,C#提供允許類和接口被分成多個片段和單獨源文件的局部類型(partialtype)。工具生成局部類(partialclass)可在編譯期間與開發(fā)員編寫的局部類合并,使得每一局部類可獨立創(chuàng)建和維護。圖1示出了一編譯系統(tǒng)。在編譯期間,開發(fā)員源代碼102和生成的源代碼104可由編譯器組件106組合。得到的實現(xiàn)代碼108(例如可執(zhí)行、中間語言)如同開發(fā)員源代碼102和生成的源代碼104被寫入單個單元中一般。局部類向軟件開發(fā)員提供向工具生成的源代碼中聲明的局部類添加成員的能力,但不允許開發(fā)員修改生成的源代碼中聲明的成員。局部類的成員可在生成的源代碼或開發(fā)員代碼任一種中聲明,但不能同時在兩者中聲明。如果對局部類的一成員被聲明了一次以上,則編譯器將生成沖突。代碼生成器可提供默認類成員修改器。默認成員修改器指示該成員聲明將在缺乏非默認成員聲明的情況中使用。因此,默認成員可用非默認類成員重寫。這向軟件開發(fā)員提供了在編譯期間不生成沖突的情況下修改工具生成的局部類成員的一種機制。圖2是示出用于處理默認成員的方法200的流程圖。于參考標號202開始,編譯器接收源代碼。源代碼可由代碼生成工具、軟件開發(fā)員或兩者產(chǎn)生。在204,檢測到默認成員修改器。當編譯器找到局部類中的默認成員時,在206處,編譯器組件確定是否存在覆蓋該默認成員的相同名字的類成員。覆蓋成員可能位于分開的開發(fā)員創(chuàng)建源文件中。如果存在非默認或覆蓋成員,則在208,編譯器將利用覆蓋成員的源代碼并忽略默認源代碼。在212,使用覆蓋源代碼來生成實現(xiàn)代碼。然而,當不存在任何覆蓋代碼時,在210,利用默認源代碼,且在212實現(xiàn)代碼包含默認源代碼。編譯過程在214終止。考慮生成的源代碼文件Customerl.cs中的以下C#類聲明partialclassCustomer{5publicdefaultstringName{get{returnname;}set{name=value;ιιpublicdefaultstringStatus{get{returnstatus;ιset{status=value;ιιpublicdefaultdecimalComputeDiscount()return(Status=="Gold"?0.1M:0.05M);}...}聲明了局部類Customer(顧客),它包括三個默認成員Name(名字)、Status(狀態(tài))和ComputeDiscount(計算折扣)。希望修改Customer成員的軟件開發(fā)員可在分開的源文件例如Customer2.cs中聲明局部類CustomerpartialclassCustomer{publicstringStatus{get{returnstatus;set{status=value;if(status=="Gold")PremierList.Add(this)publicdecimalComputeDiscount()}...}此處,開發(fā)員沒有定義Name成員。因此編譯器將利用生成的代碼中定義的默認Name成員。開發(fā)員定義了屬性成員Status和方法成員ComputeDiscount。這兩個成員在名字上與在生成的源代碼中聲明的局部類Customer的成員相同,但包括不同或附加的邏輯。由于成員修改器默認,在軟件開發(fā)員源代碼中聲明的成員將優(yōu)先于生成的代碼屬性和方法。默認成員修改器允許開發(fā)員在不直接修改生成的源代碼文件的情況下覆蓋生成的代碼中的類成員。默認成員修改器也可在藍圖中使用。如此處所用,藍圖是可被轉(zhuǎn)換成源代碼的聲明性語言文檔(例如,可擴展標記語言(XML))。使用藍圖生成的所有局部類成員可用默認修改器來自動指定,除非默認修改器被顯式關(guān)閉??紤]以下示例性藍圖不同于以上代碼的定制計算<classname="Northwind.Customer"table="Customers">〈propertyname="Name"column="ContactName"defaultModifier=”False,,/〉</class>如有需要,默認修改器可通過指定諸如CustomerName屬性的defaultModifier(默認修改器)的屬性來顯式關(guān)閉?;蛘撸褂盟{圖生成的局部類成員可被自動指定而不使用默認,除非默認修改器被顯式打開。II.用于關(guān)系管理器的代碼生成模式現(xiàn)在參考圖3,在ORM系統(tǒng)中頻繁使用工具生成的代碼。如圖3中所示,ORM系統(tǒng)300可包括用作應(yīng)用程序組件304和數(shù)據(jù)存儲組件306之間的接口的ORM組件302。關(guān)系數(shù)據(jù)可從數(shù)據(jù)存儲組件306中檢索,并由ORM系統(tǒng)302管理以供應(yīng)用程序組件304使用。常規(guī)ORM系統(tǒng)不能充分地提供對關(guān)系的管理。一般,有三種有問題的關(guān)系類型一對一、一對多和多對多。在一對一關(guān)系中,類型A的每一實體對類型B的恰好一個實體具有一關(guān)系,且類型B的該實體對類型A的該實體具有相應(yīng)的關(guān)系。例如,在簡單的清單系統(tǒng)中,每一顧客A具有唯一的信用卡號,且每一信用卡號具有與之相關(guān)聯(lián)的恰好一個的顧客。在一對多關(guān)系中,類型A的單個實體對類型B的一個或多個實體具有一關(guān)系,但類型B的每一實體與實體A的單個實體相關(guān)聯(lián)。例如,在清單系統(tǒng)中,顧客可下一張或多張定單,且每一定單將與下定單的單個顧客相關(guān)聯(lián)。最后,在多對多關(guān)系中,類型A的一實體對類型B的一個以上的實體具有關(guān)系,且類型B的每一實體對類型A的一個以上的實體具有關(guān)系。例如,可對多個產(chǎn)品下定單,且單個產(chǎn)品可被包括在多個定單中。一般,面向?qū)ο笳Z言不向軟件開發(fā)員提供管理關(guān)系數(shù)據(jù)并確保關(guān)系一致性的工具。例如,當諸如顧客定單關(guān)系的一對多關(guān)系的數(shù)據(jù)使用面向?qū)ο笤创a映射時,它通常如以下C#類聲明中所示地映射classCustomer{...publicList<0rder>0rders;}classOrder{...publicCustomerCustomer;}此處,源代碼通過聲明包括帶有Customer成員的Order(定單)類以及具有成員Orders的Cutomer類,其中Orders是與Customer的一個實例相關(guān)聯(lián)的定單列表。盡管以上示出的Customer和Order類的實例可用關(guān)系數(shù)據(jù)來填充,但這些類不能要求對象之間關(guān)系中的一致性。不存在防止開發(fā)員的代碼修改Customer實例的定單而不更新相應(yīng)定單的Customer成員的機制。當用關(guān)系數(shù)據(jù)填充對象時,程序員有責(zé)任確保對象與關(guān)系數(shù)據(jù)一致。類似地,當諸如定單的對象被移除時,程序員負責(zé)確保所有相關(guān)信息均被更新。如果Order被刪除,則Order必須從相關(guān)Customer的定單列表中移除。ORM系統(tǒng)可使用以下描述的代碼生成模式來對一對一、一對多和多對多關(guān)系建模同時實施關(guān)系一致性。代碼生成模式可包括容器組件,也被稱為容器,它允許實施關(guān)系數(shù)據(jù)充分建模所需的雙向關(guān)系。每一數(shù)據(jù)對象組件,也被稱為數(shù)據(jù)對象(例如,Customer)可包括包含對應(yīng)于該關(guān)系中的其他數(shù)據(jù)對象(例如,Order)的信息的容器。數(shù)據(jù)對象和容器可成對使用來對一對一、一對多和多對多關(guān)系建模。每一容器可包括一個或多個通知,這一個或多個通知允許容器向相應(yīng)的數(shù)據(jù)對象通知數(shù)據(jù)對象之間的關(guān)系是否被修改。容器可被實現(xiàn)為可對不同對象類型實例化的通用類。容器可包括一組數(shù)據(jù)對象(例如,一組定單)的聚集。包括一組數(shù)據(jù)對象的容器被稱為集合容器。或者,容器可包括對數(shù)據(jù)對象的引用(例如,定單的顧客名)而非一組數(shù)據(jù)對象。這樣的容器在此處被稱為引用容器。一對引用容器可被用來對一對一關(guān)系建模。一對集合容器可用來對多對多關(guān)系建模。一個引用容器和一個集合容器的組合可用來對一對多關(guān)系建模。圖4是示出顧客定單關(guān)系的框圖。顧客數(shù)據(jù)對象402具有包括對應(yīng)于定單數(shù)據(jù)對象406的對象信息的集合容器404。類似地,定單數(shù)據(jù)對象406具有包括對應(yīng)于顧客數(shù)據(jù)對象402的對象信息的引用容器408。集合容器可包括通知組件(未示出),使得對包含在集合容器404中的對象信息的改變導(dǎo)致向定單數(shù)據(jù)對象406發(fā)送通知。類似地,引用容器可包括通知組件(未示出),使得對包含在引用容器408中的對象信息的改變導(dǎo)致向顧客數(shù)據(jù)定單402發(fā)送通知??紤]以下0#代碼partialclassCustomer{publicEntitySet<0rder>0rders;}partialclassOrder{publicEntityRef<Customer>Customer;}此處,與顧客相關(guān)聯(lián)的定單列表被實現(xiàn)為使用EntitySet(實體集)類的集合容器,而與定單相關(guān)聯(lián)的顧客被實現(xiàn)為使用EntityRef(實體引用)類的引用容器。EntitySet類和EntityRef類在以下詳細描述??紤]EntitySet的示例性實現(xiàn)publicdelegatevoidNotification<T>(Τarg);publicclassEntitySet<TEntity>:IList,IList<TEntity>0116]whereTEntity:class{0117]ItemList<TEntity>entities;0118]Notification<TEntity>onAdd;0119]Notification<TEntity>onRemove;0120]publicEntitySetO{0121]}0122]publicEntitySet(Notification<TEntity>onAdd,Notification<TEntity>onRemove){0124]this.onAdd=onAdd;0125]this.onRemove=onRemove;0126]}0127]publicvoidAdd(TEntityentity){0128]if(entity==null)thrownewArgumentException();0129]entities.Add(entity);0130]if(onAdd!=null)onAdd(entity);0131]}0132]publicboolRemove(TEntityentity){0133]if(entity==null)thrownewArgumentException();0134]if(entities.Contains(entity)){0135]entities.Remove(entity);0136]if(onRemove!=null)onRemove(entity);0137]}0138]}0139]}此處,通用類EntitySet具有類型參數(shù)TEntity,其中TEntity被限于包括一個列表成員和兩個方法成員即onAdd(添加)和onRemove(移除)的類。EntitySet構(gòu)造函數(shù)具有兩個參數(shù),通知委托(delegate)onAdd和onRemove。Add和Remove方法確保通知的委托onAdd和onRemove當在EntitySet集合中添加或移除實體時被調(diào)用。EntitySet的Add方法執(zhí)行基本錯誤檢測來確保要添加的實體不為空;將實體添加到實體列表并然后使用onAdd方法向?qū)嶓w通知添加。類似地,為了從EntitySet中移除實體,Remove方法執(zhí)行基本錯誤檢測來確保要移除的實體不為空;從實體列表中移除該實體并然后使用onRemove方法向該實體通知移除。EntitySet可用來實現(xiàn)顧客定單集合的集合容器。EntityRef可用于實現(xiàn)用于存儲與每一定單相關(guān)聯(lián)的顧客的引用容器。使用EntitySet和EntityRef實現(xiàn)的容器可配對來管理一對多顧客定單關(guān)系。將在以下進一步詳細描述EntityRef。現(xiàn)在考慮利用EntitySet關(guān)系管理的上述顧客定單關(guān)系的Customer類的示例性實現(xiàn)publicpartialclassCustomer:IChangeNotifier{privateEntitySet<0rder>_0rders;publicCustomer(){/*以下代碼提供了對要用于AddO和RemoveO操作的Order對象的委托*/this.Orders=newEntitySet<0rder>(newSystem.Query.Notification<0rder>(this.attach_0rders),newSystem.Query.Notification<0rder>(this.detach_0rders));privatevoidattach—Orders(Orderentity){this.OnChanging();entity.Customer=this;privatevoiddetach—Orders(Orderentity){this.OnChanging();entity.Customer=null;此處,由EntitySet實現(xiàn)的容器基礎(chǔ)架構(gòu)可用于向Customer數(shù)據(jù)對象的Orders集合添加Order。以上僅示出了生成的代碼中與Orders的添加和刪除相關(guān)的部分,而省略了其余代碼。類Customer包括具有定單數(shù)據(jù)對象集合的EntitySet容器。Customer類包括方法attach_0rders(附加定單)和detach_0rders(分離定單),它們更新相關(guān)聯(lián)Order實體的Customer成員。對這些方法的委托作為參數(shù)被傳遞給EntitySet構(gòu)造函數(shù)。從而,以上定義的EntitySet類的Add和Remove方法將為onAdd和onRemove使用這些方法。圖5是用于為一對多關(guān)系向容器添加數(shù)據(jù)對象而同時維護數(shù)據(jù)對象關(guān)系的程序設(shè)計方法500的流程圖。具體地,將討論上述顧客定單示例的上下文中的定單添加。在參考標號502,開始添加過程??蛇M行將數(shù)據(jù)對象添加到數(shù)據(jù)對象的集合的調(diào)用。例如,一個Order即Ordl可通過調(diào)用“Custl.Orders.Add(Ordl)”被添加到顧客的實例Custl。在504,可執(zhí)行基本錯誤檢測來確定要被添加的數(shù)據(jù)對象是否為空。如果存在錯誤,則在506生成異常。否則,在508,該數(shù)據(jù)對象可被添加到數(shù)據(jù)對象集合。在添加數(shù)據(jù)對象之后,在510存在添加的通知,且512該數(shù)據(jù)對象被更新來反映該關(guān)系。具體地,Ordl.Customer被設(shè)置為Custl。該過程在514終止。圖6是用于對一對多關(guān)系從集合容器中移除數(shù)據(jù)對象而同時維護數(shù)據(jù)對象關(guān)系的程序設(shè)計方法600的流程圖。具體地,將討論上述顧客定單示例的上下文中的定單移除。在參考標號602,移除過程開始??蛇M行從數(shù)據(jù)對象集合中移除數(shù)據(jù)對象的調(diào)用。例如,一個Order即0rd2可通過調(diào)用“Custl.Orders.Remove(0rd2)”從顧客的實例Custl中移除。在604,可執(zhí)行基本錯誤檢測來確定要移除的數(shù)據(jù)對象是否為空。如果存在錯誤,則在606生成異常。否則,在608該數(shù)據(jù)對象可從數(shù)據(jù)對象集合中移除。在移除數(shù)據(jù)對象之后,在610存在移除的通知,且在612該數(shù)據(jù)對象被更新來反映該關(guān)系。具體地,0rd2.Customer被設(shè)置為空。該過程在614終止。引用容器可包含對數(shù)據(jù)對象的引用而非數(shù)據(jù)對象的集合。引用容器可被認為是集合容器的更受限制形式,且包括與集合容器中存在的相同的通知。當映射一對一或一對多關(guān)系時可使用引用容器。例如,引用容器,以下被實現(xiàn)為EntityRef,可與使用EntitySet實現(xiàn)的集合容器一起使用來對上述顧客定單關(guān)系建模??紤]以下使用C#的EntityRef的示例性實現(xiàn)publicclassEntityRef<TEntity>whereTEntityclass{TEntityentity;Notification<TEntity>onAdd;Notification<TEntity>onRemove;publicEntityRefO{}publicEntityRef(Notification<TEntity>onAdd,Notification<TEntity>onRemove){this.onAdd=onAdd;this.onRemove=onRemove;}publicTEntityEntity{get{returnentity;}set{if(onRemove!=null)onRemove(entity);entity=value;if(onAdd!=null)onAdd(entity);}}}此處,通用類EntityRef具有類型參數(shù)TEntity,其中TEntity被限于包括一個實體成員和兩個方法成員即onAdd和onRemove的類。EntityRef構(gòu)造函數(shù)具有兩個參數(shù),通知委托onAdd禾口onRemove。Add禾口Remove方法確呆通知的委托onAdd禾口onRemove當在EntitySet集合中添加或移除實體時被調(diào)用。EntityRef包括具有返回實體的取(get)訪問器以及設(shè)置實體值的設(shè)置(set)訪問器的Entity(實體)屬性。然而,設(shè)置訪問器使用onAdd或onRemove方法執(zhí)行通知。圖7是用于從集合容器中移除數(shù)據(jù)對象而同時維護數(shù)據(jù)對象關(guān)系的程序設(shè)計方法700的流程圖。具體地,參考顧客定單示例來討論定單的添加或移除。在參考標號702,進行更新數(shù)據(jù)對象的調(diào)用。例如,可通過調(diào)用“Order=Custl”來更新一個Order即Ordl以添加顧客Custl。在704,作出是要添加還是要移除數(shù)據(jù)對象的判斷。如果定單要被移除,則在706通知從數(shù)據(jù)對象集合中移除數(shù)據(jù)對象,在708將值設(shè)置為空。該過程在710處終止。然而,如果定單要被添加,則在712設(shè)置值,并在714通知將數(shù)據(jù)對象添加到數(shù)據(jù)對象集合。該過程在710終止。使用集合容器和引用容器,可對一對一、一對多和多對多關(guān)系建模。然而,為了防止通知的循環(huán),必須建立容器對中的一個成員保持控制并管理關(guān)系的協(xié)議。如果來自容器對中第一容器的通知觸發(fā)了從第二容器回到第一容器的通知則將發(fā)生循環(huán)??蓛?yōu)化用于引用容器的源代碼。引用容器可被認為是受限制的集合容器。引用容器的功能可在不聲明單獨類(例如EntityRef)的情況下實現(xiàn)。如在以下〔#代碼中所示,引用容器的功能可被移入局部類(例如,Order)的聲明中以減少開銷。}}此處,類Order的Customer屬性包括在顧客定單列表中添加或移除定單的設(shè)置訪問器。設(shè)置訪問器在功能上等效于上述EntityRef類的OnAdd和OnRemove方法。優(yōu)化引用容器可減少處理期間的開銷,但可能導(dǎo)致較不簡潔的源代碼。然而,源代碼簡潔性或清楚性對工具生成的源代碼而言不是重要的。III.延期或延遲加載對象關(guān)系映射基礎(chǔ)架構(gòu)也可允許延期或延遲加載關(guān)系數(shù)據(jù)。一般,在處理的開始處批量或在如所需基礎(chǔ)上從數(shù)據(jù)存儲組件中檢索關(guān)系數(shù)據(jù)。對數(shù)據(jù)密集的程序設(shè)計而言,數(shù)據(jù)的批量檢索可能要求大量存儲器以便在處理期間存儲數(shù)據(jù)。延緩數(shù)據(jù)的加載直到數(shù)據(jù)被引用之時,這減少所需的存儲器數(shù)量。然而,數(shù)據(jù)對象應(yīng)在被引用之前被加載到存儲器中。圖8是示出用于執(zhí)行ORM系統(tǒng)中的按需延期加載的方法800的流程圖。開始于參考標號802,在處理期間,進行了導(dǎo)航至數(shù)據(jù)對象的調(diào)用。在804,截取了數(shù)據(jù)對象的導(dǎo)航。在806,作出關(guān)于數(shù)據(jù)對象是已經(jīng)被填充且包含關(guān)系數(shù)據(jù)還是數(shù)據(jù)對象尚未被填充的判斷。如果數(shù)據(jù)對象包含關(guān)系數(shù)據(jù),則對數(shù)據(jù)對象的導(dǎo)航在812繼續(xù)。否則,在808從數(shù)據(jù)存儲組件檢索對應(yīng)于該數(shù)據(jù)對象的關(guān)系數(shù)據(jù)。檢索可包括數(shù)據(jù)庫查詢或數(shù)據(jù)檢索的任何其他方publicpartialclassOrder{privateEntityRef<Customer>_Customer;publicCustomerCustomer{get{returnthis.—Customer.Entity;Customerν=this.—Customer.Entity;if((ν!=value)){if((ν!=null)){this.—Customer.Entity=null;v.Orders.Remove(this);this.Customer.Entity=value;if((value!=null)){value.Orders.Add(this);法。在810,使用檢索到的數(shù)據(jù)來填充數(shù)據(jù)對象。對數(shù)據(jù)對象的導(dǎo)航在812繼續(xù)。引用和集合容器可包括允許關(guān)系數(shù)據(jù)的延期加載的加載組件。容器可截取數(shù)據(jù)對象之間的導(dǎo)航、查詢數(shù)據(jù)存儲組件并在運行時(on-the-fly)創(chuàng)建并填充數(shù)據(jù)對象,從而創(chuàng)造數(shù)據(jù)對象被完全填充的錯覺而實際上不要求在使用之前將每個數(shù)據(jù)對象都加載到存儲器中。以下示例性C#代碼向EntitySet類提供了附加的成員以允許延遲或延期加載publicclassEntitySet<TEntity>IList,IList<TEntity>whereTEntity:class{IEntitySetLoader<TEntity>loader;...publicTEntitythis[intindex]{get{Load();if(index<0||index>=entities.Count)thrownewArgumentException();returnentities[index];}set{Load();if(index<0||index>=entities.Count)thrownewArgumentException();if(value==nullIndexOf(value)>=0)thrownewArgumentException();entities[index]=value;OnRemove(old);OnAdd(value);}}publicvoidLoadO{if(loader!=null){entities=newList<TEntity>(loader.GetEntities());loader=null;}}publicinterfaceIEntitySetLoader<TEntity>{voidTrackAdd(TEntityentity);voidTrackRemove(TEntityentity);IEnumerab1e<TEntity>LoadEntities();}此處,取訪問器截取對TEntity對象的導(dǎo)航,并調(diào)用EntitySet類的Load(加載)方法成員。Load方法檢查來查看TEntity對象是否已被加載到存儲器中,如果否,則創(chuàng)建并填充實體列表。使用取訪問器截取導(dǎo)航確保在EntitySet的目標被引用之前即被加載。類似地,設(shè)置訪問器截取至TEntity對象的導(dǎo)航。設(shè)置訪問器也調(diào)用加載方法來確保在設(shè)置TEntity對象的值之前創(chuàng)建并填充了該TEntity對象。IV.強類型表一般,數(shù)據(jù)對象被存儲在諸如數(shù)據(jù)庫的數(shù)據(jù)存儲系統(tǒng)或組件的關(guān)系數(shù)據(jù)表中。例如,在以上討論的清單系統(tǒng)中,數(shù)據(jù)存儲組件可包括顧客表和定單表。當向清單系統(tǒng)添加一新顧客或定單時,向適當?shù)谋硖砑右恍?。類似地,當從清單系統(tǒng)中刪除一顧客或定單時,從適當?shù)谋碇袆h除一行。當使用面向?qū)ο蟪绦蛟O(shè)計構(gòu)造來對來自數(shù)據(jù)存儲系統(tǒng)的關(guān)系數(shù)據(jù)建模時,對象模型或構(gòu)造應(yīng)包括對應(yīng)于數(shù)據(jù)存儲系統(tǒng)的關(guān)系數(shù)據(jù)表的一組強類型數(shù)據(jù)對象表。程序設(shè)計語言構(gòu)造數(shù)據(jù)對象表可以是供應(yīng)用程序中使用的數(shù)據(jù)存儲系統(tǒng)的關(guān)系數(shù)據(jù)表的表示。在清單系統(tǒng)示例中,生成的源代碼應(yīng)包括Customers表和Orders表。應(yīng)用程序?qū)?gòu)造表的任何改變應(yīng)被跟蹤并存到數(shù)據(jù)存儲系統(tǒng)表。例如,諸如Customer的類的每一新創(chuàng)建的實例應(yīng)被跟蹤,使得可通過將新的相應(yīng)的Customer行插入到相應(yīng)的數(shù)據(jù)存儲系統(tǒng)表中來更新該表。類似地,Customer或其他類實例的刪除應(yīng)被跟蹤,并被存到相應(yīng)的數(shù)據(jù)存儲系統(tǒng)表中以便刪除行。可使用通用類(例如,Table(表))來創(chuàng)建數(shù)據(jù)對象表。通用類可專用于處理存儲在數(shù)據(jù)對象表中的不同類型的對象(例如顧客、定單、供應(yīng)商、承運商...)。使用通用類來實現(xiàn)數(shù)據(jù)對象表利用了表的公共特征。例如,每一表可要求添加和移除數(shù)據(jù)對象的方法。考慮Table的以下示例性聲明publicclassTable<T>{publicvoidAdd(Τitem){H對象關(guān)系映射基礎(chǔ)架構(gòu)跟蹤要添加的項目}publicvoidRemove(Τitem){H對象關(guān)系映射基礎(chǔ)架構(gòu)跟蹤要移除的項目}}在通用類Table中定義成員Add(添加)和Remove(移除)消除了為每一個單獨的數(shù)據(jù)對象表創(chuàng)建Add和Remove成員的必要性。圖9示出了用于創(chuàng)建對應(yīng)于數(shù)據(jù)存儲系統(tǒng)表的一組數(shù)據(jù)對象表的方法900。開始于參考標號902,確定數(shù)據(jù)存儲系統(tǒng)中表的數(shù)目以及每一表的類型。在904,使用通用類實例化對應(yīng)于數(shù)據(jù)存儲系統(tǒng)表的數(shù)據(jù)對象表。在906,進行檢查來確定是否存在要建模的其他數(shù)據(jù)存儲系統(tǒng)表。如果是,則在904實例化下一數(shù)據(jù)對象表。如果已經(jīng)建模了所有數(shù)據(jù)存儲系統(tǒng)表,則該方法在908終止。對示例清單系統(tǒng),可使用一組數(shù)據(jù)對象表來創(chuàng)建一數(shù)據(jù)上下文以鏡像表示數(shù)據(jù)存儲系統(tǒng)表??紤]以下〔#代碼publicpartialclassNorthwindDataContext{publicTable<Category>Categories;publicTable<Customer>Customers;publicTable<Shipper>Shippers;publicTable<Supplier>Suppliers;publicTable<0rder>0rders;publicTable<Product>Products;}此處,使用通用類Table來創(chuàng)建Customers、Shippers(承運商)、Suppliers(供應(yīng)商)、Orders和Products(產(chǎn)品)的集合。如此處所用的,Table<T>是相應(yīng)的數(shù)據(jù)存儲系統(tǒng)表的虛擬表示。生成的代碼允許對各個數(shù)據(jù)對象表的Add和Remove方法進行強類型檢查。生成數(shù)據(jù)對象表也省去軟件開發(fā)員必須為數(shù)據(jù)存儲系統(tǒng)的每一表定義單獨的表類的工作,減少了開發(fā)員的工作和調(diào)試時間。使用強類型表僅跟蹤新創(chuàng)建的實例和檢索到的被刪除的實例。用于調(diào)用生成的代碼來確保適當跟蹤了新和被刪除的實例的示例性方法如下所示NorthwindmyNorthwind;...Customercc=newCustomer{CustomerlD="ABCDE“,CompanyName="AcmeProducts〃};myNorthwind.Customers.Add(cc);Customercd=db.Customers.Element(|c|c.CustomerlD==〃ALFKI〃);myNorthwind.Customers.Remove(cd);V.關(guān)系數(shù)據(jù)改變檢測和跟蹤代碼生成系統(tǒng)也允許檢測和跟蹤對從數(shù)據(jù)存儲系統(tǒng)中采集到對象模型的關(guān)系數(shù)據(jù)的改變。當從數(shù)據(jù)存儲系統(tǒng)中采集關(guān)系數(shù)據(jù)以填充由應(yīng)用程序使用的數(shù)據(jù)對象時,數(shù)據(jù)對象可在無需ORM系統(tǒng)的知識的情況下被修改。然而,任何插入、修改或刪除應(yīng)被存回數(shù)據(jù)存儲系統(tǒng)。另外,當?shù)谝粦?yīng)用程序處理時,其他應(yīng)用程序可訪問數(shù)據(jù)存儲系統(tǒng)并修改曾用于填充由第一應(yīng)用程序使用的數(shù)據(jù)對象的關(guān)系數(shù)據(jù)。當關(guān)系數(shù)據(jù)從第一應(yīng)用程序存到數(shù)據(jù)存儲系統(tǒng)時,它不應(yīng)重寫由其他應(yīng)用程序作出的改變。一個簡單的解決方案是維護所有數(shù)據(jù)對象的副本;副本包含從數(shù)據(jù)存儲系統(tǒng)檢索到的原始數(shù)據(jù)。副本可與數(shù)據(jù)對象的當前值比較以確定數(shù)據(jù)對象是否被修改了。這導(dǎo)致存儲器被用于存儲保持不變的數(shù)據(jù)對象的相同副本。另外,當修改被存到數(shù)據(jù)存儲系統(tǒng)時,每一數(shù)據(jù)對象與其包含原始值的副本進行比較以確定是否存在對數(shù)據(jù)對象的任何改變。處理時間浪費在比較保持不變的數(shù)據(jù)對象上。在所公開的本主題的一個方面中,代碼生成器組件可生成源級代碼,它可由開發(fā)員看見并修改,以實現(xiàn)改變檢測和跟蹤。改變檢測和跟蹤可在源級代碼中實現(xiàn)而非隱藏在中間格式(例如,字節(jié)碼或IL(中間語言))。將實現(xiàn)置于源級代碼使得它對軟件開發(fā)員透明。生成的代碼可僅為被應(yīng)用程序修改的那些數(shù)據(jù)對象創(chuàng)建副本。這可消除為每一數(shù)據(jù)對象創(chuàng)建副本的需求,并通過限制副本的數(shù)目來最小化空間開銷。另外,這可消除將未經(jīng)改變的數(shù)據(jù)對象與其副本進行比較來確定數(shù)據(jù)對象是否改變所需的處理時間?,F(xiàn)在轉(zhuǎn)向圖10,容器源代碼可包括當數(shù)據(jù)對象將要被修改時通知ORM系統(tǒng)中的改變檢測組件的改變通知組件。改變通知組件可利用事件處理程序。圖10示出了用于跟蹤經(jīng)修改的對象的方法1000。開始于參考標號1002,應(yīng)用程序進行更新數(shù)據(jù)對象的調(diào)用。在1006,改變檢測組件檢查數(shù)據(jù)對象之前是否已被復(fù)制。如果數(shù)據(jù)對象之前未被復(fù)制,則在1008改變檢測組件復(fù)制數(shù)據(jù)對象,并將數(shù)據(jù)對象的副本添加到經(jīng)修改數(shù)據(jù)對象的列表。如果數(shù)據(jù)對象已被復(fù)制,則原始數(shù)據(jù)對象的副本已被添加到列表且不應(yīng)被重寫。在1010,數(shù)據(jù)對象如應(yīng)用程序所指定地來更新??紤]以下示例性《1代碼publicpartialclassCustomer:IChangeNotifier{privatestring_CustomerID;publicstringCustomerID{get{returnthis._CustomerID;}set{if((this._CustomerID!=value)){H以下通知引起復(fù)制原始值this.OnChanging();this._CustomerID=value;}}}privatevoidOnChanging(){if((this.ObjectChanging!=null)){this.ObjectChanging(this,System.EventArgs.Empty);}}}通知接口可用于指定用于改變對象的事件處理程序publicinterfaceIChangeNotifier{eventObjectChangingEventHandlerObjectChanging;}此處,以上詳細描述的Customer類內(nèi)的屬性的組訪問器包括告知ORM系統(tǒng)的改變檢測組件數(shù)據(jù)對象將要改變的通知。正好在數(shù)據(jù)對象實際改變之前才向ORM系統(tǒng)通知以允許ORM系統(tǒng)在數(shù)據(jù)對象被修改之前創(chuàng)建副本?,F(xiàn)在轉(zhuǎn)向圖11,在某時對數(shù)據(jù)對象的修改應(yīng)被存回數(shù)據(jù)存儲系統(tǒng)。圖11示出了用于將改變存到數(shù)據(jù)存儲系統(tǒng)的方法1100。開始于1102,向經(jīng)修改的數(shù)據(jù)對象檢索第一數(shù)據(jù)對象副本。數(shù)據(jù)對象副本包含從數(shù)據(jù)存儲系統(tǒng)采集的原始關(guān)系數(shù)據(jù)。在1104,將數(shù)據(jù)對象副本與數(shù)據(jù)存儲系統(tǒng)中的數(shù)據(jù)對象進行比較。在1106,進行檢查以確定數(shù)據(jù)對象副本是否不同于數(shù)據(jù)存儲系統(tǒng)對象。如果是,則數(shù)據(jù)存儲系統(tǒng)中的數(shù)據(jù)對象已被修改,且在1108生成異常。如果數(shù)據(jù)對象副本和數(shù)據(jù)對象存儲系統(tǒng)相同,則數(shù)據(jù)存儲系統(tǒng)對象未經(jīng)修改,且在1110經(jīng)修改的數(shù)據(jù)對象被存回數(shù)據(jù)存儲系統(tǒng)。在1112,進行檢查以確定在經(jīng)修改的數(shù)據(jù)對象列表中是否有附加的數(shù)據(jù)對象。如果是,則在1102檢索下一數(shù)據(jù)對象副本。否則,該方法在1114終止。參考若干組件之間的交互描述了前述系統(tǒng)。應(yīng)理解,這樣的系統(tǒng)和組件可包括此處指定的這些組件或子組件、所指定的組件或子組件中的某些和/或附加組件。子組件也可被實現(xiàn)為通信耦合至其他組件而非包括在父組件內(nèi)的組件。另外,應(yīng)注意到,一個或多個組件可被組合成提供聚集功能的單個組件或被分成若干子組件。組件也可與此處未具體描述但為本領(lǐng)域的技術(shù)人員已知的一個或多個其他組件交互。而且,如可以理解的,以上公開系統(tǒng)和以下方法的各個部分可包括人工智能或基于知識或規(guī)則的組件、子組件、進程、裝置、方法或機制(例如,支持向量機、神經(jīng)網(wǎng)絡(luò)、專家系統(tǒng)、貝葉斯置信網(wǎng)絡(luò)、模糊邏輯、數(shù)據(jù)融合引擎、分類器...)或由其組成。這樣的組件及其它可自動化某些機制或由此執(zhí)行的過程來使得該系統(tǒng)和方法的某些部分更加自適應(yīng)且高效和智能的。考慮上述示例性系統(tǒng),參考圖2、5_11的流程圖,可更好地理解根據(jù)所公開的主題實現(xiàn)的方法。盡管為說明簡單起見,方法被顯示并描述為一連串框,但可以理解和領(lǐng)會,所要求保護的主題不受框順序的限制,某些框可按照不同的順序發(fā)生和/或與此處描繪和描述的其他框并發(fā)。而且,不是所有示出的框都是對實現(xiàn)之后描述的方法所必需的。另外,還應(yīng)理解,以下并在本說明書全文中公開的方法能夠被存儲在制品上以便于將這樣的方法傳輸和傳送給計算機。如此處所用的,術(shù)語制品旨在包含可從任何計算機可讀設(shè)備、載波或介質(zhì)訪問的計算機程序。為了向所公開的主題的各個方面提供上下文,圖12和13以及以下討論旨在提供可在其中實現(xiàn)所公開主題的各個方面的合適環(huán)境的簡要、一般描述。盡管以上在運行在一個和/或多個計算機上的計算機程序的計算機可執(zhí)行指令的一般上下文中描述了本主題,但本領(lǐng)域的技術(shù)人員可以認識到,本發(fā)明可也與其他程序模塊組合來實現(xiàn)。一般,程序模塊包括例程、程序、組件、數(shù)據(jù)結(jié)構(gòu)等,它們執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型。而且,本領(lǐng)域的技術(shù)人員可以理解,本發(fā)明的方法可以使用其它計算機系統(tǒng)配置來實現(xiàn),包括單處理器或多處理器計算機系統(tǒng)、小型計算設(shè)備、大型機、以及個人計算機、手持式設(shè)備(例如,個人數(shù)字助理(PDA)、電話、手表...)、基于微處理器或可編程消費者或工業(yè)電子產(chǎn)品等。所示方面也可以在分布式計算環(huán)境中實現(xiàn),其中任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠程處理設(shè)備來執(zhí)行。然而,即使不是本發(fā)明的全部方面,本發(fā)明的某些方面也可在單機計算機上實現(xiàn)。在分布式計算環(huán)境中,程序模塊可以位于本地和遠程存儲器存儲設(shè)備中。參考圖12,用于實現(xiàn)此處公開的各方面的示例性環(huán)境1210包括計算機1212(例如,臺式、膝上型、服務(wù)器、手持、可編程消費者或工業(yè)電子產(chǎn)品...)。計算機1212包括處理單元1214、系統(tǒng)存儲器1216和系統(tǒng)總線1218。系統(tǒng)總線1218將包括但不限于系統(tǒng)存儲器1216的系統(tǒng)組件耦合至處理單元1214。處理單元1214可以是任何各種可用的微處理器。也可以使用雙微處理器和其它多處理器體系結(jié)構(gòu)作為處理單元1214。系統(tǒng)總線1218可以是若干類型的總線結(jié)構(gòu)中的任一種,包括存儲器總線或存儲器控制器、外圍總線或外部總線和/或使用各種可用的總線體系結(jié)構(gòu)中的任一種的局部總線,可用的總線體系結(jié)構(gòu)包括,但不限于,11位總線、工業(yè)標準體系結(jié)構(gòu)(ISA)、微通道體系結(jié)構(gòu)(MCA)、擴展的ISA(EISA)、智能驅(qū)動器電子接口(IDE)、VESA局部總線(VLB)、外圍部件互連(PCI)、通用串行總線(USB)、高級圖形接口(AGP)、個人計算機存儲卡國際協(xié)會總線(PCMCIA)以及小型計算機系統(tǒng)接口(SCSI)。系統(tǒng)存儲器1216包括易失性存儲器1220和非易失性存儲器1222?;据斎?輸出系統(tǒng)(BIOS)包含有助于諸如啟動時在計算機1212中元件之間傳遞信息的基本例程,它通常存儲在非易失性存儲器1222中。作為說明,而非限制,非易失性存儲器1222可以包括只讀存儲器(ROM)、可編程ROM(PROM)、電可編程ROM(EPROM)、電可擦除ROM(EEPROM)或閃存。易失性存儲器1220可以包括用作外部高速緩存存儲器的隨機存取存儲器(RAM)。作為說明,而非限制,RAM以多種形式可用,諸如同步RAM(SRAM)、動態(tài)RAM(DRAM)、同步DRAM(SDRAM)、雙倍數(shù)據(jù)速率SDRAM(DDRSDRAM)、增強型SDRAM(ESDRAM)、同步鏈路DRAM(SLDRAM)以及直接RambusRAM(DRRAM)。計算機1212也包括可移動/不可以移動、易失性/非易失性計算機存儲介質(zhì)。例如,圖12示出盤片存儲1224。盤片存儲1224包括,但不限于,如磁盤驅(qū)動器、軟盤驅(qū)動器、磁帶驅(qū)動器、Jaz驅(qū)動器、Zip驅(qū)動器、Ls-IOO驅(qū)動器、閃存卡或記憶棒的設(shè)備。另外,盤片存儲1224可以包括獨立或與其它存儲介質(zhì)組合的存儲介質(zhì),包括但不限于,諸如光盤ROM設(shè)備(⑶-ROM)、⑶可記錄驅(qū)動器(⑶-R驅(qū)動器)、⑶可重寫驅(qū)動器(⑶-RW驅(qū)動器)或數(shù)字多功能盤ROM驅(qū)動器(DVD-ROM)等的光盤驅(qū)動器。為了便于將盤片存儲設(shè)備1224連接至系統(tǒng)總線1218,一般使用諸如接口1226等可移動或不可移動接口??梢岳斫猓瑘D12描述了作為用戶和在合適的操作環(huán)境1210中描述的基本計算機資源之間的中介的軟件。這樣的軟件包括操作系統(tǒng)1228??杀淮鎯υ诒P片存儲1224上的操作系統(tǒng)1228用來控制和分配計算機系統(tǒng)1212的資源。系統(tǒng)應(yīng)用程序1230通過存儲在系統(tǒng)存儲器1216或者盤片存儲1224上的程序模塊1232和程序數(shù)據(jù)1234利用了操作系統(tǒng)1228進行的資源管理。可以理解,本發(fā)明可以使用各種操作系統(tǒng)或操作系統(tǒng)的組合來實現(xiàn)。用戶通過輸入設(shè)備1236向計算機1212輸入命令或信息。輸入設(shè)備1236包括,但不限于,諸如鼠標、跟蹤球、指示筆等定點設(shè)備、觸摸墊、鍵盤、麥克風(fēng)、操縱桿、游戲手柄、圓盤式衛(wèi)星天線、掃描儀、TV調(diào)諧器卡、數(shù)碼相機、數(shù)碼攝像機、網(wǎng)絡(luò)攝像頭等。這些和其它輸入設(shè)備經(jīng)由接口端口1238通過系統(tǒng)總線1218連接至處理單元1214。接口端口1238包括,例如串行端口、并行端口、游戲端口和通用串行總線(USB)。輸出設(shè)備1240使用某些與輸入設(shè)備1236相同類型的端口。從而,例如,USB端口可以用于向計算機1212提供輸入,并向輸出設(shè)備1240提供來自計算機1212的輸出信息。提供輸出適配器1242來示出,存在類似顯示器(例如平板和CRT)、揚聲器和打印機以及其它需要專用適配器的輸出設(shè)備1240的某些輸出設(shè)備1240。作為說明而非限制,輸出適配器1242包括提供輸出設(shè)備1240和系統(tǒng)總線1218之間的連接手段的顯卡和聲卡。應(yīng)該注意,諸如遠程計算機1244等其它設(shè)備和/或設(shè)備系統(tǒng)同時提供輸入和輸出能力兩者。計算機1212可使用至一臺或多臺遠程計算機,諸如遠程計算機1244的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠程計算機1244可以是個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、工作站、基于微處理器的裝置、對等設(shè)備或其它常見網(wǎng)絡(luò)節(jié)點等,且通常包括上文相對于計算機1212描述的許多或所有元件。為簡潔起見,對于遠程計算機1244僅示出存儲器存儲設(shè)備1246。遠程計算機1244通過網(wǎng)絡(luò)接口1248被邏輯連接至計算機1212,并且然后通過通信連接1250被物理地連接。網(wǎng)絡(luò)接口1248包括諸如局域網(wǎng)(LAN)和廣域網(wǎng)(WAN)的通信網(wǎng)絡(luò)。LAN技術(shù)包括光纖分布式數(shù)據(jù)接口(FDDI)、銅線分布式數(shù)據(jù)接口(⑶DI)、以太網(wǎng)/IEEE802.3、令牌環(huán)/IEEE802.5等。WAN技術(shù)包括,但不限于,點對點鏈路、類似綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)及其變體的電路交換網(wǎng)絡(luò)、分組交換網(wǎng)絡(luò)和數(shù)字用戶線(DSL)。通信連接1250指的是用來將網(wǎng)絡(luò)接口1248連接至總線1218的硬件/軟件。盡管為說明清楚,將通信連接1250示為位于計算機1212內(nèi),然而通信連接1250也可以在計算機1212外部。僅為示例的目的,連接至網(wǎng)絡(luò)接口1248所必需的硬件/軟件包括內(nèi)部和外部技術(shù),諸如包括常規(guī)電話級調(diào)制解調(diào)器、線纜調(diào)制解調(diào)器、電力調(diào)制解調(diào)器和DSL調(diào)制解調(diào)器等的調(diào)制解調(diào)器、ISDN適配器以及以太網(wǎng)卡或組件。圖13是本發(fā)明可與之交互的示例計算環(huán)境1300的示意性框圖。系統(tǒng)1300包括一個或多個客戶機1310??蛻魴C1310可以是硬件和/或軟件(例如,線程、進程、計算設(shè)備)。系統(tǒng)1300也包括一個或多個服務(wù)器1330。由此,系統(tǒng)1300可對應(yīng)于兩層客戶機服務(wù)器模型或多層模型(例如,客戶機、中間層服務(wù)器、數(shù)據(jù)服務(wù)器)等其他模型。服務(wù)器1330也可以是硬件和/或軟件(例如,線程、進程、計算設(shè)備)??蛻魴C1310和服務(wù)器1330之間的一種可能的通信可以是適于在兩個或多個計算機進程之間傳輸?shù)臄?shù)據(jù)包的形式。系統(tǒng)1300包括可以被用來促進客戶機1310和服務(wù)器1330之間通信的通信架構(gòu)1350。客戶機1310可操作地連接至可用來存儲對客戶機1310本地的信息的一個或多個客戶機數(shù)據(jù)存儲1360。類似地,服務(wù)器1330可操作地連接至可被用來存儲對服務(wù)器1330本地的信息的一個或多個服務(wù)器數(shù)據(jù)存儲1340。以上描述的包括所要求保護的主題的各方面的示例。當然,不可能為描述所要求保護的主題而描述每個可想象的組件或方法的組合,但是本領(lǐng)域的普通技術(shù)人員可以認識到,所要求保護的主題的眾多其它組合和排列是可能的。從而,所要求保護的主題旨在包括落入所附權(quán)利要求書精神和范圍內(nèi)的所有這樣的變更、修改和變化。而且,就在詳細描述和權(quán)利要求書中都使用的術(shù)語“包括”、“具有”或“含有”而言,當被用作權(quán)利要求書中的過渡詞時,這樣的術(shù)語旨在類似于解釋術(shù)語“包含”的方式是包含性的。權(quán)利要求一種編譯在至少兩個分開位置聲明的源代碼的方法,包括標識至少一個默認類成員;在所述源代碼中搜索對應(yīng)于所述至少一個默認類成員的非默認類成員;以及如果找到所述對應(yīng)的非默認類成員,則利用所述非默認類成員從所述源代碼生成實現(xiàn)代碼,并在沒有對應(yīng)的非默認類成員的情況下利用所述默認類成員。2.如權(quán)利要求1所述的方法,其特征在于,所述默認類成員是使用藍圖生成的。3.如權(quán)利要求1所述的方法,其特征在于,所述默認類成員是使用代碼生成工具生成的。4.一種編譯在至少兩個分開位置聲明的源代碼的系統(tǒng),包括用于標識至少一個默認類成員的裝置;用于在所述源代碼中搜索對應(yīng)于所述至少一個默認類成員的非默認類成員的裝置;以及用于如果找到所述對應(yīng)的非默認類成員,則利用所述非默認類成員從所述源代碼生成實現(xiàn)代碼,并在沒有對應(yīng)的非默認類成員的情況下利用所述默認類成員的裝置。全文摘要本公開關(guān)于在對象關(guān)系映射中使用的代碼生成模式。該代碼模式可用于管理雙向關(guān)系并確保一致性。該代碼模式可支持按需或延期的關(guān)系數(shù)據(jù)加載。也提供了改變檢測和跟蹤。另外,默認成員修改器允許開發(fā)員在不直接修改生成的源代碼的情況下覆蓋工具生成的源代碼。文檔編號G06F17/30GK101894027SQ20101024493公開日2010年11月24日申請日期2006年6月29日優(yōu)先權(quán)日2005年7月29日發(fā)明者A·赫杰斯伯格,D·C·庫爾卡尼,H·J·M·梅杰,L·伯洛格納斯,M·J·沃倫,P·A·豪拉姆申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1