謝日星武漢軟件工程職業(yè)學院,湖北武漢 430205
ADO.NET Entity Framework是微軟以ADO.NET為基礎所發(fā)展出來的對象關(guān)系對應(O/R Mapping)解決方案。Entity Framework以Entity Data Model(EDM)為主,利用抽象化數(shù)據(jù)結(jié)構(gòu)方式,將數(shù)據(jù)庫對象轉(zhuǎn)換成應用程序?qū)ο?,庫表字段轉(zhuǎn)換為屬性,并系轉(zhuǎn)換為關(guān)聯(lián)系統(tǒng),把數(shù)據(jù)庫的E/R模型轉(zhuǎn)換成對象模型,使開發(fā)人員通過對概念應用程序模型編程來創(chuàng)建數(shù)據(jù)訪問應用程序,以此降低面向數(shù)據(jù)的應用程序所需要的開發(fā)量,并減輕系統(tǒng)維護工作。
Entity Framework技術(shù)的應用中,可針對數(shù)據(jù)庫中各個表按照1:1映射生成模型和映射信息,在代碼中直接對表中數(shù)據(jù)進行增、刪、改、查操作。但在實際應用中,這種簡單的處理方式不利于進一步降低程序開發(fā)工作量,部分情況還違背了“程序開發(fā)以應用為中心的概念模型來工作”的理念,對象的概念不清晰。為此,對幾種常用的數(shù)據(jù)庫情景的建模方法進行介紹。
在帶有有效栽花的多對多關(guān)系數(shù)據(jù)庫中,關(guān)系表除了主鍵外,還有其他數(shù)據(jù)字段。在這種關(guān)系中,直接把表映射到實體模型中,兩實體表自動創(chuàng)建對應的實體類型,而關(guān)系表也被映射成為一實體類型,在此實體類型中除了原有屬性名,還有對應兩實體表的導航屬性,可分別通過1對多關(guān)系進行對象導航。
對于分類表之類的自引用表,把表映射成為實體類型后,其中將包含兩個導航屬性,分別對應父、子對象,其中父對象為1端,多端為子對象集合,因此分別把1端改名為父端名稱如ParentCategory,多端改名為子對象集合名稱如SubCategories。由此兩導航屬性可方便地訪問到對應對象。
在數(shù)據(jù)庫設計過程中,當一個實體的數(shù)據(jù)由于各種原因為分割在不同表中,而程序開發(fā)需要把實體所有數(shù)據(jù)集合在一個實體類型中。對于這種跨表實體的情況,建模時首先把所有的表都映射到實體模型中,然后調(diào)整實體類型,把主要表之外的其它表映射實體類中除主鍵對應屬性外的所有屬性復制到主要表映射實體類型中,然后刪除主要表映射實體類型中的所有導航屬性和其它表實體類型,在刪除其它表實體類型時,不刪除映射存儲模型中的表,最后,在剩下的這一個表映射實體類型中,添加復制得到的所有屬性的映射關(guān)系,分別映射到對應的表中的列。在實體操作過程中,映射關(guān)系能自動分別處理不同表中的對應數(shù)據(jù)。
在表中如果有部分字段內(nèi)容較多并且不常使用,為提高程序性能,訪問表時,一般只訪問表中的部分字段,為此,建模時必須把表分割成多個實體。首先把表映射成一般實體類型,然后在設計器中創(chuàng)建新實體類型,添加對應原表中主健的屬性,再把原映射實體類型中不需要的屬性通過“剪切/粘貼”方法移動到新實體類型中,并把新實體類型中的所有屬性映射到原表對應字段,然后在原實體類型中添加到新實體類型的1對1(或1對0.1)關(guān)聯(lián)關(guān)系,最后,在添加以新實體類型為主體的到原實體類型的引用約束。通過實體類型訪問數(shù)據(jù)時,兩實體類型對象分別訪問其屬性對應的字段數(shù)據(jù)。
數(shù)據(jù)庫建模完成后,對于有些表存儲另一表中額外信息的情況,可以針對這些表建立派生的類體系結(jié)構(gòu)。首先,把所有表映射到實體模型中,分別映射成一個實體類型,然后刪除實體類型之間的關(guān)聯(lián),再為基類(Business)添加繼承,分別設置派生類為Retails和eCommerces,再刪除派生類中的BusinessId屬性,則根據(jù)表的結(jié)構(gòu)完成類的體系結(jié)構(gòu)建模,對Retails和eCommerces類型對象的操作會自動訪問庫表Retails、eCommerces及對應的Business表中對應記錄。
對于常見的辦公自動化系統(tǒng)數(shù)據(jù)庫,由于員工類型不同,而薪水制度不同,其中EmployeeType值為1則為臨時工,薪水按小時計算,Wage字段記錄其每小時薪水,Salary字段為無效數(shù)據(jù),如果EmployeeType值為2則為正式員工,薪水按月計算,Salary字段記錄其每月薪水,Wage字段數(shù)據(jù)無效。為更好地實現(xiàn)在向應用編程,分別建立臨時工和正式員工兩種類型,但兩種類型的數(shù)據(jù)都保存在Employees表中。建模過程首先把Employees表映射到實體模型中,成為Employees類,然后添加新實體HourlyEmployee,指定基類為Employees,然后通過“剪切/粘貼”把Employees中的Wage屬性移動到HourlyEmployee中,用同樣的方法添加實體FullTimeEmployee類型;再在HourlyEmployee實體中,添加映射條件:“EmployeeType = 1”,在FullTimeEmployee實體中添加映射條件:“EmployeeType = 2”,然后設置Employees類型為抽象類,并刪除其中的EmployeeType屬性,則HourlyEmployee和FullTimeEmployee自動處理EmployeeType字段的值,并能自動根據(jù)記錄創(chuàng)建對應類型的對象。
POCO技術(shù)要求盡可能的應用簡單的類,以實現(xiàn)類型的獨立性,本文所討論的Entity Framework建模方法則常常需要把表進行分割建模或組合建模,在某些情況下將導致類的體系結(jié)構(gòu)更為復雜,但卻使程序開發(fā)更為符合業(yè)務的現(xiàn)實情況,能更充分地利用Entity Framework技術(shù)的各種技術(shù)優(yōu)勢。
[1]微軟公司著.VS2010 MSDN.