本節(jié),將介紹如何手動(dòng)構(gòu)造復(fù)雜類(lèi)型(ComplexType)以及復(fù)雜類(lèi)型的簡(jiǎn)單操作。
通常,復(fù)雜類(lèi)型是指那些由幾個(gè)簡(jiǎn)單的類(lèi)型組合而成的類(lèi)型。比如:一張Customer表,其中有FristName和LastName字段,那么對(duì)應(yīng)的Customer實(shí)體類(lèi)將會(huì)有FristName和LastName這兩個(gè)屬性。當(dāng)我們想把FirstName和LastName合成一個(gè)名為CustomerName屬性時(shí),此時(shí),如果要在EF中實(shí)現(xiàn)這個(gè)目的,那么我們就需要用到復(fù)雜類(lèi)型。
目前,由于EF不能顯示支持復(fù)雜類(lèi)型,所以我們無(wú)法在VS里的可視化設(shè)計(jì)器里面來(lái)設(shè)計(jì)我們需要的復(fù)雜類(lèi)型。所以,我們需要手動(dòng)修改實(shí)體模型,以便使其支持復(fù)雜類(lèi)型的屬性。修改的主要步驟有以下幾步:
1> 產(chǎn)生實(shí)體模型
2> 修改CSDL文件
3> 修改msl文件
4> 重新生成模型實(shí)體類(lèi)
在后續(xù)的介紹,我使用數(shù)據(jù)庫(kù)使用的是NorthWind,并針對(duì)Customer表對(duì)應(yīng)的實(shí)體類(lèi)來(lái)增加復(fù)雜屬性Address,其中復(fù)雜屬性Address由Address,City,Region,Country和PostalCode這個(gè)幾個(gè)組合而成。
下面,介紹具體的操作步驟:
第一步:產(chǎn)生實(shí)體模型
實(shí)體模型的產(chǎn)生我們可以直接通過(guò)在VS可視化設(shè)計(jì)器來(lái)產(chǎn)生(如果不會(huì),請(qǐng)參考《Entity Framework 學(xué)習(xí)初級(jí)篇1--EF基本概況》)?;蛘呤褂肊dmGen工具來(lái)產(chǎn)生(EdmGen工具位于:系統(tǒng)盤(pán)符:\WINDOWS\Microsoft.NET\Framework\v3.5下面)。具體步驟就不復(fù)述了。
我產(chǎn)生的實(shí)體模型文件是:NorthwindEnites.edmx
第二步:修改csdl文件
產(chǎn)生了實(shí)體模型后,我們使用記事本或其他文本編輯工具打開(kāi)實(shí)體模型,(小技巧:可以把實(shí)體模型后綴.edmx改為.xml,然后把實(shí)體模型文件直接拖到VS里面進(jìn)行修改,這樣修改起來(lái)比較方便,待修改完畢后,將后綴改回來(lái)即可。)
接著,開(kāi)始手動(dòng)修改csdl文件,找到模型文件中關(guān)于csdl定義的部分,然后找到實(shí)體類(lèi)型名為Customers的定義節(jié),刪除原來(lái)的Address,City,Region,Country,PostalCode屬性定義,然后添加一個(gè)名為Address的屬性,如下代碼所示:
接著,需要添加一個(gè)名為CommonAddress復(fù)雜類(lèi)型的定義,具體如下代碼:
至此,csdl部分修改完畢。
第三步,修改msl文件:
找到msl部分的定義,修改Customers部分的影射定義。具體代碼如下(請(qǐng)注意ComplexProperty節(jié)):
至此,msl部分修改完畢
第四步:重新產(chǎn)生實(shí)體類(lèi)文件。
我們可以使用EmdGen2工具來(lái)重新實(shí)體類(lèi).cs文件。具體操作如下:
將修改好的模型文件(edmx),拷貝到使用edmgen2.exe同目錄下,然后在命令行中輸入:
Edmgen2 /codegen cs NorthwindEnites.edmx
執(zhí)行此命令后,會(huì)在當(dāng)前的文件夾下生成一個(gè)NorthwindEnites.cs代碼文件,也就是實(shí)體類(lèi)的代碼文件。將改文件改名為:NorthwindEnites.Designer.cs(這步主要是和edmx對(duì)應(yīng)起來(lái))。
然后,將NorthwindEnites.edmx和NorthwindEnites.Designer.cs文件添加到項(xiàng)目中。
至此,復(fù)合類(lèi)型的修改完畢。
按照同樣的修改過(guò)程,我們可以給Employees也增加一個(gè)Address的復(fù)雜類(lèi)型屬性。
接下來(lái),我們看看具體使用代碼:
> 查詢(xún):
public void TestAddress() { using (var db = new NorthwindModel.NorthwindEntities1()) { Console.WriteLine("Get Five customer addresss :"); var cts = db.Customers.Take(5); foreach (var c in cts) { Console.WriteLine("Address:{0},Country:{1},City:{2},PostalCode:{3}", c.Address.Address, c.Address.Country, c.Address.City, c.Address.PostalCode); } Console.WriteLine("Get Five Employess address:"); var emp = db.Customers.Take(5); foreach (var c in emp) { Console.WriteLine("Address:{0},Country:{1},City:{2},PostalCode:{3}", c.Address.Address, c.Address.Country, c.Address.City, c.Address.PostalCode); } } }
> 添加:
public void AddTest() { using (var db = new NorthwindModel.NorthwindEntities1()) { var customer = new NorthwindModel.Customers { CustomerID = "2009", CompanyName = "Complex Company", ContactName = "xray2005", Address = new NorthwindModel.CommonAddress { Address = "SiChuan,China", City = "ChengDou", Country = "China", PostalCode = "610041", Region = "Chenghua" } }; db.AddToCustomers(customer); db.SaveChanges(); var cst = db.Customers.FirstOrDefault(c => c.CustomerID == "2009"); Assert.IsNotNull(cst); Console.WriteLine("CustomerID:{0},CompanyName:{1},ContactName:{2},City:{3},Country:{4}", cst.CustomerID, cst.CompanyName, cst.ContactName, cst.Address.City, cst.Address.Country); } }
> 條件查詢(xún):
public void QueryTest() { using (var db = new NorthwindModel.NorthwindEntities1()) { var cst = db.Customers.FirstOrDefault(c => c.Address.City == "ChengDou"); Assert.IsNotNull(cst); Console.WriteLine("CustomerID:{0},CompanyName:{1},ContactName:{2},City:{3},Country:{4}", cst.CustomerID, cst.CompanyName, cst.ContactName, cst.Address.City, cst.Address.Country); } }
最后,補(bǔ)充說(shuō)明:
1, 在VS的可視化設(shè)計(jì)器里,不支持復(fù)雜類(lèi)型,所以修改后無(wú)法再在可視化設(shè)計(jì)器里修改模型(edmx文件)。
2, 復(fù)雜類(lèi)型不能單獨(dú)存在,它必須和某一實(shí)體相關(guān)起來(lái)。
3, 復(fù)雜類(lèi)型不能包含導(dǎo)航屬性,如導(dǎo)航到實(shí)體或?qū)嶓w集。
4, 復(fù)雜類(lèi)型具有內(nèi)部結(jié)構(gòu)但沒(méi)有 Key(主鍵) 屬性的數(shù)據(jù)類(lèi)型
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。