国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      代碼生成模式的制作方法

      文檔序號:6568400閱讀:175來源:國知局

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