HOW TO:自訂模型與對應檔以搭配自訂物件運作 (Entity Framework)
若要搭配 Entity Framework 使用自訂資料類別,概念模型中所定義的實體類型和屬性必須符合自訂資料類別。 當您使用實體資料模型 工具從資料庫產生模型和對應內容時,概念模型中的實體類型和實體集會符合資料庫中的資料表。 若要更新模型和對應內容以符合自訂資料類別,您必須執行下列步驟:
更新概念結構定義語言 (CSDL) 中定義的概念模型內容,以符合自訂資料類別。
若有需要,更新存放結構定義語言 (SSDL) 中定義的儲存體模型內容。
更新對應規格語言 (MSL) 中定義的對應內容。
驗證更新的模型和對應內容。
避免 Visual Studio 產生物件層。
注意: |
---|
實體資料模型 工具也可以產生指令碼,該指令碼可根據存放結構定義語言 (SSDL) 內容建立新的資料庫。在此情況下,您可以建立符合自訂資料類別的資料模型,然後再根據 .edmx 檔案建立新的資料庫。如需詳細資訊,請參閱 How to: Create a Database from a Conceptual Model。 |
本主題顯示如何使用 ADO.NET Entity Data Model Designer (Entity Designer) 或 EDM 產生器 (EdmGen.exe) 公用程式更新模型。 若要執行本主題中的範例,必須先產生您的模型。 本範例中的模型是根據 AdventureWorks 資料庫中的 Contact、SalesOrderHeader 和 SalesOrderDetail 資料表。 如需關於如何建立新模型的詳細資訊,請參閱 HOW TO:使用實體資料模型精靈 (Entity Framework)或 HOW TO:使用 EdmGen.exe 產生模型和對應檔。 您也必須將對應至 Contact、SalesOrderHeader 和 SalesOrderDetail 資料表的 Contact、Orders 和 LineItem 自訂資料類別加入至您的專案。 若要定義 Contact、Orders 和 LineItem 自訂資料類別,請參閱 HOW TO:定義 POCO 實體 (Entity Framework)。
下列程序假設您有一個在 Entity Designer 中開啟的 .edmx 檔案。
使用實體資料模型設計工具修改模型。
重新命名 EntityType 和 EntitySet 元素,以反映自訂資料類別的名稱。
選取 [Contact] 實體。 在 [屬性] 視窗中,將 [實體集名稱] 設定為 ContactSet。
選取 [SalesOrderHeader] 實體。 在 [屬性] 視窗中,將 [名稱] 設定為 Order,將 [實體集名稱] 設定為 OrderSet。
選取 [SalesOrderDetails]。 在 [屬性] 視窗中,將 [名稱] 設定為 LineItem,將 Entity Set Name 設定為 LineItemSet。
變更導覽屬性的名稱。
選取 [Contact] 實體的 [SalesOrderHeaders] 導覽屬性。 在 [屬性] 視窗中,將 [名稱] 設定為 Orders。
選取 [SalesOrderHeader] 實體的 [SalesOrderDetails] 導覽屬性。 在 [屬性] 視窗中,將 [名稱] 設定為 LineItems。
選取 [SalesOrderDetail] 實體的 [SalesOrderHeader] 導覽屬性。 在 [屬性] 視窗中,將 [名稱] 設定為 Order。
變更關聯。
選取 Client 和 Order 實體類型之間的關聯,並修改下列屬性以符合下列 [屬性] 視窗中的值:
關聯集名稱:Order_ Contact_ ContactIDSet
End1 導覽屬性:Orders
End1 角色名稱:Contact
End2 導覽屬性:Contact
End2 角色名稱:Order
名稱:Order_Contact_ContactID
選取 Order 和 LineItem 實體類型之間的關聯,並修改下列屬性以符合下列 [屬性] 視窗中的值:
關聯集名稱:LineItem_Order_SalesOrderIDSet
End1 導覽屬性:LineItems
End1 角色名稱:Order
End2 導覽屬性:Order
End2 角色名稱:LineItem
名稱:LineItem_Order_SalesOrderID
從 Order 實體類型的屬性建立複雜型別。
選取以下 [Order] 實體的屬性:[AccountNumber]、[Comment]、[PurchaseOrderNumber] 和 [SalesOrderNumber],然後以滑鼠右鍵按一下並選取 [建立複雜型別]。
含有已選取之屬性的新複雜型別隨即會加入到 [模型瀏覽器]。 新複雜型別屬性會加入至 SalesOrderHeader 實體。 會給予複雜型別和複雜型別屬性預設名稱。
將複雜型別重新命名為 OrderInfo。
將複雜類型屬性重新命名為 ExtendedInfo。
將變更儲存至 .edmx 檔案。
停用 .edmx 檔案的程式碼產生。 在 ADO.NET Entity Data Model Designer (Entity Designer) 中開啟 .edmx 檔案。 以滑鼠右鍵按一下設計工具介面並選取 [屬性]。 在 [屬性] 視窗中,選取 [程式碼產生策略] 屬性並選取 [None]。 如果看不到 [屬性] 視窗,請按 F4。
使用 EdmGen.exe 修改模型。
在 Visual Studio 或文字編輯器中開啟 CSDL 檔案。
重新命名 EntityType 和 EntitySet 元素,以反映自訂資料類別的名稱。
重新命名每一個型別的 Property 元素,使其符合自訂資料類別中的屬性名稱。
針對不存在於自訂資料類別中的任何屬性移除 Property 元素。
重新命名 NavigationProperty 元素以符合自訂資料類別中的導覽屬性名稱。 請確認 FromRole 和 ToRole 指向正確的實體類型。
將變更儲存至 .csdl 檔案。
在 Visual Studio 或文字編輯器中開啟 MSL 檔案。
重新命名 EntitySetMapping 元素和 TypeName 屬性,以反映自訂類別的名稱。
針對沒有對應自訂資料類別的任何實體移除 EntitySetMapping 元素。
重新命名每一個型別的 ScalarProperty 元素,使其符合自訂資料類別中的屬性名稱。
針對不存在於自訂資料類別中的任何屬性移除 ScalarProperty 元素。
將變更儲存至 .msl 檔案。
在 Visual Studio 或文字編輯器中開啟 SSDL 檔案。
針對未對應到自訂資料類別的任何實體,移除 EntityType 元素。
針對未對應到自訂資料類別之屬性的任何屬性,移除 ScalarProperty 元素。
將變更儲存至 .ssdl 檔案。
在包含對應檔的目錄中執行 EdmGen.exe 公用程式,藉以驗證更新的對應檔。
請使用以下命令:
%windir%\Microsoft.NET\Framework\v4\edmgen.exe /mode:ValidateArtifacts /inssdl:. \YourModel.ssdl /inmsl:. \YourModel.msl /incsdl:. \YourModel.csdl
注意: 移除分行符號,並使用對應檔的名稱取代 YourModel。 - 檢閱輸出,並修復任何驗證錯誤。
重新產生、儲存和移除自動產生的物件程式碼。
在 Visual Studio 的 [方案總管] 中,以滑鼠右鍵按一下 .csdl檔案,然後選取 [執行自訂工具]。
這樣會根據修改過的 .csdl 檔案重新產生物件層。
展開 .csdl 檔案節點,開啟設計工具檔案,並將檔案另存為不同的檔案名稱。
這樣會儲存自動產生的物件層檔案。 這個檔案的程式碼會用於 HOW TO:定義自訂物件內容 (Entity Framework) 主題中。
從專案中排除此設計工具檔案。
選取 .csdl 檔案,並在 [屬性] 視窗中清除 [自訂工具] 的值。
這樣會阻止物件層檔案的重新產生。 如果未來要產生這個檔案,請在 [屬性] 視窗中,針對 [自訂工具] 輸入 EntityModelCodeGenerator,然後重複步驟 1。
範例
已自訂下列 .csdl 檔案,可支援 Contact、Orders 和 LineItem 自訂資料類別。
<Schema Namespace="AdventureWorksModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
<EntityContainer Name="AdventureWorksEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="LineItemSet" EntityType="AdventureWorksModel.LineItem" />
<EntitySet Name="OrderSet" EntityType="AdventureWorksModel.Order" />
<AssociationSet Name="LineItem_Order_SalesOrderIDSet" Association="AdventureWorksModel.LineItem_Order_SalesOrderID">
<End Role="Order" EntitySet="OrderSet" />
<End Role="LineItem" EntitySet="LineItemSet" />
</AssociationSet>
<EntitySet Name="ContactSet" EntityType="AdventureWorksModel.Contact" />
<AssociationSet Name="Order_Contact_ContactID" Association="AdventureWorksModel.Order_Contact_ContactID">
<End Role="Contact" EntitySet="ContactSet" />
<End Role="Order" EntitySet="OrderSet" /></AssociationSet>
</EntityContainer>
<EntityType Name="LineItem">
<Key>
<PropertyRef Name="SalesOrderID" />
<PropertyRef Name="SalesOrderDetailID" />
</Key>
<Property Name="SalesOrderID" Type="Int32" Nullable="false" />
<Property Name="SalesOrderDetailID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="CarrierTrackingNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" />
<Property Name="OrderQty" Type="Int16" Nullable="false" />
<Property Name="ProductID" Type="Int32" Nullable="false" />
<Property Name="SpecialOfferID" Type="Int32" Nullable="false" />
<Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="UnitPriceDiscount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="LineTotal" Type="Decimal" Nullable="false" Precision="38" Scale="6" annotation:StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="Order" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="LineItem" ToRole="Order" />
</EntityType>
<EntityType Name="Order">
<Key>
<PropertyRef Name="SalesOrderID" />
</Key>
<Property Name="SalesOrderID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="RevisionNumber" Type="Byte" Nullable="false" />
<Property Name="OrderDate" Type="DateTime" Nullable="false" />
<Property Name="DueDate" Type="DateTime" Nullable="false" />
<Property Name="ShipDate" Type="DateTime" />
<Property Name="Status" Type="Byte" Nullable="false" />
<Property Name="OnlineOrderFlag" Type="Boolean" Nullable="false" />
<Property Name="CustomerID" Type="Int32" Nullable="false" />
<Property Name="ContactID" Type="Int32" Nullable="false" />
<Property Name="SalesPersonID" Type="Int32" />
<Property Name="TerritoryID" Type="Int32" />
<Property Name="BillToAddressID" Type="Int32" Nullable="false" />
<Property Name="ShipToAddressID" Type="Int32" Nullable="false" />
<Property Name="ShipMethodID" Type="Int32" Nullable="false" />
<Property Name="CreditCardID" Type="Int32" />
<Property Name="CreditCardApprovalCode" Type="String" MaxLength="15" Unicode="false" FixedLength="false" />
<Property Name="CurrencyRateID" Type="Int32" />
<Property Name="SubTotal" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TaxAmt" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="Freight" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TotalDue" Type="Decimal" Nullable="false" Precision="19" Scale="4" annotation:StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="LineItems" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="Order" ToRole="LineItem" />
<Property Name="ExtendedInfo" Type="AdventureWorksModel.OrderInfo" Nullable="false" />
<NavigationProperty Name="Contact" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Order" ToRole="Contact" />
</EntityType>
<Association Name="LineItem_Order_SalesOrderID">
<End Role="Order" Type="AdventureWorksModel.Order" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="LineItem" Type="AdventureWorksModel.LineItem" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Order">
<PropertyRef Name="SalesOrderID" />
</Principal>
<Dependent Role="LineItem">
<PropertyRef Name="SalesOrderID" />
</Dependent>
</ReferentialConstraint>
</Association>
<ComplexType Name="OrderInfo">
<Property Type="String" Name="Comment" MaxLength="128" FixedLength="false" Unicode="true" />
<Property Type="String" Name="AccountNumber" MaxLength="15" FixedLength="false" Unicode="true" />
<Property Type="String" Name="PurchaseOrderNumber" MaxLength="25" FixedLength="false" Unicode="true" />
<Property Type="String" Name="SalesOrderNumber" Nullable="false" MaxLength="25" FixedLength="false" Unicode="true" /></ComplexType>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" /></Key>
<Property Type="Int32" Name="ContactID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="Boolean" Name="NameStyle" Nullable="false" />
<Property Type="String" Name="Title" MaxLength="8" FixedLength="false" Unicode="true" />
<Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="MiddleName" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="Suffix" MaxLength="10" FixedLength="false" Unicode="true" />
<Property Type="String" Name="EmailAddress" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="Int32" Name="EmailPromotion" Nullable="false" />
<Property Type="String" Name="Phone" MaxLength="25" FixedLength="false" Unicode="true" />
<Property Type="String" Name="PasswordHash" Nullable="false" MaxLength="128" FixedLength="false" Unicode="false" />
<Property Type="String" Name="PasswordSalt" Nullable="false" MaxLength="10" FixedLength="false" Unicode="false" />
<Property Type="String" Name="AdditionalContactInfo" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Type="Guid" Name="rowguid" Nullable="false" />
<Property Type="DateTime" Name="ModifiedDate" Nullable="false" />
<NavigationProperty Name="Orders" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Contact" ToRole="Order" /></EntityType>
<Association Name="Order_Contact_ContactID">
<End Type="AdventureWorksModel.Contact" Role="Contact" Multiplicity="1" />
<End Type="AdventureWorksModel.Order" Role="Order" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Contact">
<PropertyRef Name="ContactID" /></Principal>
<Dependent Role="Order">
<PropertyRef Name="ContactID" /></Dependent></ReferentialConstraint></Association>
</Schema>
已自訂下列 .msl 檔案,可將 Contact、Orders 和 LineItem 自訂資料類別對應至 AdventureWorks 資料庫中的 Contact、SalesOrderHeader 和 SalesOrderDetail 資料表。
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
<EntityContainerMapping StorageEntityContainer="AdventureWorksModelStoreContainer" CdmEntityContainer="AdventureWorksEntities">
<EntitySetMapping Name="LineItemSet">
<EntityTypeMapping TypeName="AdventureWorksModel.LineItem">
<MappingFragment StoreEntitySet="SalesOrderDetail">
<ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
<ScalarProperty Name="SalesOrderDetailID" ColumnName="SalesOrderDetailID" />
<ScalarProperty Name="CarrierTrackingNumber" ColumnName="CarrierTrackingNumber" />
<ScalarProperty Name="OrderQty" ColumnName="OrderQty" />
<ScalarProperty Name="ProductID" ColumnName="ProductID" />
<ScalarProperty Name="SpecialOfferID" ColumnName="SpecialOfferID" />
<ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
<ScalarProperty Name="UnitPriceDiscount" ColumnName="UnitPriceDiscount" />
<ScalarProperty Name="LineTotal" ColumnName="LineTotal" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="OrderSet">
<EntityTypeMapping TypeName="AdventureWorksModel.Order">
<MappingFragment StoreEntitySet="SalesOrderHeader">
<ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
<ScalarProperty Name="RevisionNumber" ColumnName="RevisionNumber" />
<ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
<ScalarProperty Name="DueDate" ColumnName="DueDate" />
<ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
<ScalarProperty Name="Status" ColumnName="Status" />
<ScalarProperty Name="OnlineOrderFlag" ColumnName="OnlineOrderFlag" />
<ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
<ScalarProperty Name="ContactID" ColumnName="ContactID" />
<ScalarProperty Name="SalesPersonID" ColumnName="SalesPersonID" />
<ScalarProperty Name="TerritoryID" ColumnName="TerritoryID" />
<ScalarProperty Name="BillToAddressID" ColumnName="BillToAddressID" />
<ScalarProperty Name="ShipToAddressID" ColumnName="ShipToAddressID" />
<ScalarProperty Name="ShipMethodID" ColumnName="ShipMethodID" />
<ScalarProperty Name="CreditCardID" ColumnName="CreditCardID" />
<ScalarProperty Name="CreditCardApprovalCode" ColumnName="CreditCardApprovalCode" />
<ScalarProperty Name="CurrencyRateID" ColumnName="CurrencyRateID" />
<ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
<ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
<ScalarProperty Name="Freight" ColumnName="Freight" />
<ScalarProperty Name="TotalDue" ColumnName="TotalDue" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
<ComplexProperty Name="ExtendedInfo">
<ScalarProperty Name="SalesOrderNumber" ColumnName="SalesOrderNumber" />
<ScalarProperty Name="PurchaseOrderNumber" ColumnName="PurchaseOrderNumber" />
<ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
<ScalarProperty Name="Comment" ColumnName="Comment" />
</ComplexProperty>
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="ContactSet">
<EntityTypeMapping TypeName="AdventureWorksModel.Contact">
<MappingFragment StoreEntitySet="Contact">
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="AdditionalContactInfo" ColumnName="AdditionalContactInfo" />
<ScalarProperty Name="PasswordSalt" ColumnName="PasswordSalt" />
<ScalarProperty Name="PasswordHash" ColumnName="PasswordHash" />
<ScalarProperty Name="Phone" ColumnName="Phone" />
<ScalarProperty Name="EmailPromotion" ColumnName="EmailPromotion" />
<ScalarProperty Name="EmailAddress" ColumnName="EmailAddress" />
<ScalarProperty Name="Suffix" ColumnName="Suffix" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="MiddleName" ColumnName="MiddleName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Title" ColumnName="Title" />
<ScalarProperty Name="NameStyle" ColumnName="NameStyle" />
<ScalarProperty Name="ContactID" ColumnName="ContactID" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
</EntityContainerMapping>
</Mapping>
已自訂下列 .ssdl 檔案,使用 AdventureWorks 資料庫中的 Contact、SalesOrderHeader 和 SalesOrderDetail 資料表,即可支援 Contact、Orders 和 LineItem 自訂資料類別。
<Schema Namespace="AdventureWorksModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="AdventureWorksModelStoreContainer">
<EntitySet Name="Contact" EntityType="AdventureWorksModel.Store.Contact" store:Type="Tables" Schema="Person" />
<EntitySet Name="SalesOrderDetail" EntityType="AdventureWorksModel.Store.SalesOrderDetail" store:Type="Tables" Schema="Sales" />
<EntitySet Name="SalesOrderHeader" EntityType="AdventureWorksModel.Store.SalesOrderHeader" store:Type="Tables" Schema="Sales" />
<AssociationSet Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" Association="AdventureWorksModel.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
<End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
<End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
</AssociationSet>
<AssociationSet Name="FK_SalesOrderHeader_Contact_ContactID" Association="AdventureWorksModel.Store.FK_SalesOrderHeader_Contact_ContactID">
<End Role="Contact" EntitySet="Contact" />
<End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" />
</Key>
<Property Name="ContactID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="NameStyle" Type="bit" Nullable="false" />
<Property Name="Title" Type="nvarchar" MaxLength="8" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="MiddleName" Type="nvarchar" MaxLength="50" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="Suffix" Type="nvarchar" MaxLength="10" />
<Property Name="EmailAddress" Type="nvarchar" MaxLength="50" />
<Property Name="EmailPromotion" Type="int" Nullable="false" />
<Property Name="Phone" Type="nvarchar" MaxLength="25" />
<Property Name="PasswordHash" Type="varchar" Nullable="false" MaxLength="128" />
<Property Name="PasswordSalt" Type="varchar" Nullable="false" MaxLength="10" />
<Property Name="AdditionalContactInfo" Type="xml" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<EntityType Name="SalesOrderDetail">
<Key>
<PropertyRef Name="SalesOrderID" />
<PropertyRef Name="SalesOrderDetailID" />
</Key>
<Property Name="SalesOrderID" Type="int" Nullable="false" />
<Property Name="SalesOrderDetailID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="CarrierTrackingNumber" Type="nvarchar" MaxLength="25" />
<Property Name="OrderQty" Type="smallint" Nullable="false" />
<Property Name="ProductID" Type="int" Nullable="false" />
<Property Name="SpecialOfferID" Type="int" Nullable="false" />
<Property Name="UnitPrice" Type="money" Nullable="false" />
<Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
<Property Name="LineTotal" Type="numeric" Nullable="false" Precision="38" Scale="6" StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<EntityType Name="SalesOrderHeader">
<Key>
<PropertyRef Name="SalesOrderID" />
</Key>
<Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="RevisionNumber" Type="tinyint" Nullable="false" />
<Property Name="OrderDate" Type="datetime" Nullable="false" />
<Property Name="DueDate" Type="datetime" Nullable="false" />
<Property Name="ShipDate" Type="datetime" />
<Property Name="Status" Type="tinyint" Nullable="false" />
<Property Name="OnlineOrderFlag" Type="bit" Nullable="false" />
<Property Name="SalesOrderNumber" Type="nvarchar" Nullable="false" MaxLength="25" StoreGeneratedPattern="Computed" />
<Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
<Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
<Property Name="CustomerID" Type="int" Nullable="false" />
<Property Name="ContactID" Type="int" Nullable="false" />
<Property Name="SalesPersonID" Type="int" />
<Property Name="TerritoryID" Type="int" />
<Property Name="BillToAddressID" Type="int" Nullable="false" />
<Property Name="ShipToAddressID" Type="int" Nullable="false" />
<Property Name="ShipMethodID" Type="int" Nullable="false" />
<Property Name="CreditCardID" Type="int" />
<Property Name="CreditCardApprovalCode" Type="varchar" MaxLength="15" />
<Property Name="CurrencyRateID" Type="int" />
<Property Name="SubTotal" Type="money" Nullable="false" />
<Property Name="TaxAmt" Type="money" Nullable="false" />
<Property Name="Freight" Type="money" Nullable="false" />
<Property Name="TotalDue" Type="money" Nullable="false" StoreGeneratedPattern="Computed" />
<Property Name="Comment" Type="nvarchar" MaxLength="128" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
<End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="SalesOrderDetail" Type="AdventureWorksModel.Store.SalesOrderDetail" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="SalesOrderHeader">
<PropertyRef Name="SalesOrderID" />
</Principal>
<Dependent Role="SalesOrderDetail">
<PropertyRef Name="SalesOrderID" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_SalesOrderHeader_Contact_ContactID">
<End Role="Contact" Type="AdventureWorksModel.Store.Contact" Multiplicity="1" />
<End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Contact">
<PropertyRef Name="ContactID" />
</Principal>
<Dependent Role="SalesOrderHeader">
<PropertyRef Name="ContactID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>