赞助商
上一篇:ADO.NET Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务

本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。

通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如果要在EF中实现这个目的,那么我们就需要用到复杂类型。

目前,由于EF不能显示支持复杂类型,所以我们无法在VS里的可视化设计器里面来设计我们需要的复杂类型。所以,我们需要手动修改实体模型,以便使其支持复杂类型的属性。修改的主要步骤有以下几步:

l        产生实体模型

l        修改CSDL文件

l        修改msl文件

l        重新生成模型实体类

在后续的介绍,我使用数据库使用的是NorthWind,并针对Customer表对应的实体类来增加复杂属性Address,其中复杂属性Address由Address,City,Region,Country和PostalCode这个几个组合而成。

下面,介绍具体的操作步骤:

第一步:产生实体模型

实体模型的产生我们可以直接通过在VS可视化设计器来产生(如果不会,请参考《Entity Framework 学习初级篇1--EF基本概况》)。或者使用EdmGen工具来产生(EdmGen工具位于:系统盘符:\WINDOWS\Microsoft.NET\Framework\v3.5下面)。具体步骤就不复述了。

我产生的实体模型文件是:NorthwindEnites.edmx

第二步:修改csdl文件

产生了实体模型后,我们使用记事本或其他文本编辑工具打开实体模型,(小技巧:可以把实体模型后缀.edmx改为.xml,然后把实体模型文件直接拖到VS里面进行修改,这样修改起来比较方便,待修改完毕后,将后缀改回来即可。)

接着,开始手动修改csdl文件,找到模型文件中关于csdl定义的部分,然后找到实体类型名为Customers的定义节,删除原来的Address,City,Region,Country,PostalCode属性定义,然后添加一个名为Address的属性,如下代码所示:
  1.       <EntityType Name="Customers">

  2.           <Key>

  3.             <PropertyRef Name="CustomerID" />

  4.           </Key>

  5.           <Property Name="CustomerID" Type="String" Nullable="false" MaxLength="5" Unicode="true" FixedLength="true" />

  6.           <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />

  7.           <Property Name="ContactName" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />

  8.           <Property Name="ContactTitle" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />

  9.           <Property Name="Address" Type="NorthwindModel.CommonAddress" Nullable="false"></Property>

  10.           <Property Name="Phone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />

  11.           <Property Name="Fax" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />

  12.           <NavigationProperty Name="Orders" Relationship="NorthwindModel.FK_Orders_Customers" FromRole="Customers" ToRole="Orders" />

  13.           <NavigationProperty Name="CustomerDemographics" Relationship="NorthwindModel.CustomerCustomerDemo" FromRole="Customers" ToRole="CustomerDemographics" />

  14.         </EntityType>
复制代码
接着,需要添加一个名为CommonAddress复杂类型的定义,具体如下代码:
  1. <ComplexType Name="CommonAddress">

  2.           <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />

  3.           <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

  4.           <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

  5.           <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />

  6.           <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

  7.         </ComplexType>
复制代码
至此,csdl部分修改完毕。

第三步,修改msl文件

找到msl部分的定义,修改Customers部分的影射定义。具体代码如下(请注意ComplexProperty节):
  1. <EntitySetMapping Name="Customers">

  2.             <EntityTypeMapping TypeName="IsTypeOf(NorthwindModel.Customers)">

  3.               <MappingFragment StoreEntitySet="Customers">

  4.                 <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />

  5.                 <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />

  6.                 <ScalarProperty Name="ContactName" ColumnName="ContactName" />

  7.                 <ScalarProperty Name="ContactTitle" ColumnName="ContactTitle" />

  8.                 <ComplexProperty Name="Address" TypeName="NorthwindModel.CommonAddress">

  9.                   <ScalarProperty Name="Address" ColumnName="Address" />

  10.                   <ScalarProperty Name="City" ColumnName="City" />

  11.                   <ScalarProperty Name="Region" ColumnName="Region" />

  12.                   <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />

  13.                   <ScalarProperty Name="Country" ColumnName="Country" />

  14.                 </ComplexProperty>

  15.                 <ScalarProperty Name="Phone" ColumnName="Phone" />

  16.                 <ScalarProperty Name="Fax" ColumnName="Fax" />

  17.               </MappingFragment>

  18.             </EntityTypeMapping>

  19.   </EntitySetMapping>
复制代码
至此,msl部分修改完毕。
赞助商
赞助商
TOP