日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EF支持复杂类型的实现

發(fā)布時間:2024/9/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EF支持复杂类型的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié),將介紹如何手動構造復雜類型(ComplexType)以及復雜類型的簡單操作。
通常,復雜類型是指那些由幾個簡單的類型組合而成的類型。比如:一張Customer表,其中有FristName和LastName字段,那么對應的Customer實體類將會有FristName和LastName這兩個屬性。當我們想把FirstName和LastName合成一個名為CustomerName屬性時,此時,如果要在EF中實現(xiàn)這個目的,那么我們就需要用到復雜類型。
目前,由于EF不能顯示支持復雜類型,所以我們無法在VS里的可視化設計器里面來設計我們需要的復雜類型。所以,我們需要手動修改實體模型,以便使其支持復雜類型的屬性。修改的主要步驟有以下幾步:

1> 產(chǎn)生實體模型
2> 修改CSDL文件
3> 修改msl文件
4> 重新生成模型實體類

在后續(xù)的介紹,我使用數(shù)據(jù)庫使用的是NorthWind,并針對Customer表對應的實體類來增加復雜屬性Address,其中復雜屬性Address由Address,City,Region,Country和PostalCode這個幾個組合而成。
下面,介紹具體的操作步驟:

第一步:產(chǎn)生實體模型
實體模型的產(chǎn)生我們可以直接通過在VS可視化設計器來產(chǎn)生(如果不會,請參考《Entity Framework 學習初級篇1--EF基本概況》)。或者使用EdmGen工具來產(chǎn)生(EdmGen工具位于:系統(tǒng)盤符:\WINDOWS\Microsoft.NET\Framework\v3.5下面)。具體步驟就不復述了。
我產(chǎn)生的實體模型文件是:NorthwindEnites.edmx

第二步:修改csdl文件
產(chǎn)生了實體模型后,我們使用記事本或其他文本編輯工具打開實體模型,(小技巧:可以把實體模型后綴.edmx改為.xml,然后把實體模型文件直接拖到VS里面進行修改,這樣修改起來比較方便,待修改完畢后,將后綴改回來即可。)
接著,開始手動修改csdl文件,找到模型文件中關于csdl定義的部分,然后找到實體類型名為Customers的定義節(jié),刪除原來的Address,City,Region,Country,PostalCode屬性定義,然后添加一個名為Address的屬性,如下代碼所示:

<EntityType?Name="Customers"><Key><PropertyRef?Name="CustomerID"?/></Key><Property?Name="CustomerID"?Type="String"?Nullable="false"?MaxLength="5"?Unicode="true"?FixedLength="true"?/><Property?Name="CompanyName"?Type="String"?Nullable="false"?MaxLength="40"?Unicode="true"?FixedLength="false"?/><Property?Name="ContactName"?Type="String"?MaxLength="30"?Unicode="true"?FixedLength="false"?/><Property?Name="ContactTitle"?Type="String"?MaxLength="30"?Unicode="true"?FixedLength="false"?/><Property?Name="Address"?Type="NorthwindModel.CommonAddress"?Nullable="false"></Property><Property?Name="Phone"?Type="String"?MaxLength="24"?Unicode="true"?FixedLength="false"?/><Property?Name="Fax"?Type="String"?MaxLength="24"?Unicode="true"?FixedLength="false"?/><NavigationProperty?Name="Orders"?Relationship="NorthwindModel.FK_Orders_Customers"?FromRole="Customers"?ToRole="Orders"?/><NavigationProperty?Name="CustomerDemographics"?Relationship="NorthwindModel.CustomerCustomerDemo"?FromRole="Customers"?ToRole="CustomerDemographics"?/></EntityType>

接著,需要添加一個名為CommonAddress復雜類型的定義,具體如下代碼:

<ComplexType?Name="CommonAddress"><Property?Name="Address"?Type="String"?MaxLength="60"?Unicode="true"?FixedLength="false"?/><Property?Name="City"?Type="String"?MaxLength="15"?Unicode="true"?FixedLength="false"?/><Property?Name="Region"?Type="String"?MaxLength="15"?Unicode="true"?FixedLength="false"?/><Property?Name="PostalCode"?Type="String"?MaxLength="10"?Unicode="true"?FixedLength="false"?/><Property?Name="Country"?Type="String"?MaxLength="15"?Unicode="true"?FixedLength="false"?/></ComplexType>

至此,csdl部分修改完畢。

第三步,修改msl文件:
找到msl部分的定義,修改Customers部分的影射定義。具體代碼如下(請注意ComplexProperty節(jié)):

<EntitySetMapping?Name="Customers"><EntityTypeMapping?TypeName="IsTypeOf(NorthwindModel.Customers)"><MappingFragment?StoreEntitySet="Customers"><ScalarProperty?Name="CustomerID"?ColumnName="CustomerID"?/><ScalarProperty?Name="CompanyName"?ColumnName="CompanyName"?/><ScalarProperty?Name="ContactName"?ColumnName="ContactName"?/><ScalarProperty?Name="ContactTitle"?ColumnName="ContactTitle"?/><ComplexProperty?Name="Address"?TypeName="NorthwindModel.CommonAddress"><ScalarProperty?Name="Address"?ColumnName="Address"?/><ScalarProperty?Name="City"?ColumnName="City"?/><ScalarProperty?Name="Region"?ColumnName="Region"?/><ScalarProperty?Name="PostalCode"?ColumnName="PostalCode"?/><ScalarProperty?Name="Country"?ColumnName="Country"?/></ComplexProperty><ScalarProperty?Name="Phone"?ColumnName="Phone"?/><ScalarProperty?Name="Fax"?ColumnName="Fax"?/></MappingFragment></EntityTypeMapping></EntitySetMapping>

至此,msl部分修改完畢
第四步:重新產(chǎn)生實體類文件。
我們可以使用EmdGen2工具來重新實體類.cs文件。具體操作如下:
將修改好的模型文件(edmx),拷貝到使用edmgen2.exe同目錄下,然后在命令行中輸入:
Edmgen2 /codegen cs NorthwindEnites.edmx
執(zhí)行此命令后,會在當前的文件夾下生成一個NorthwindEnites.cs代碼文件,也就是實體類的代碼文件。將改文件改名為:NorthwindEnites.Designer.cs(這步主要是和edmx對應起來)。
然后,將NorthwindEnites.edmx和NorthwindEnites.Designer.cs文件添加到項目中。
至此,復合類型的修改完畢。
按照同樣的修改過程,我們可以給Employees也增加一個Address的復雜類型屬性。
接下來,我們看看具體使用代碼:

> 查詢:

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);} }

> ?條件查詢:

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);} }

最后,補充說明:
1, 在VS的可視化設計器里,不支持復雜類型,所以修改后無法再在可視化設計器里修改模型(edmx文件)。
2, 復雜類型不能單獨存在,它必須和某一實體相關起來。
3, 復雜類型不能包含導航屬性,如導航到實體或實體集。
4, 復雜類型具有內部結構但沒有 Key(主鍵) 屬性的數(shù)據(jù)類型


轉載于:https://blog.51cto.com/12883930/1923193

總結

以上是生活随笔為你收集整理的EF支持复杂类型的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。