zoukankan      html  css  js  c++  java
  • ADO.NET Entity Framework 如何:自定义建模和映射文件以使用自定义对象(实体框架)

    若要将自定义数据类用于实体框架,您必须将在概念模型中定义的实体类型和属性匹配到自定义数据类。当您使用实体数据模型工具从数据库中生成模型和映射内容时,概念模型中的实体类型和实体集将与数据库中的表匹配。若要更新模型和映射内容以与自定义数据类匹配,必须执行以下步骤:

    1. 更新概念模型内容(此内容在概念架构定义语言 (CSDL) 中定义)以匹配自定义数据类。

    2. 如果需要,则更新存储模型内容(此内容在存储架构定义语言 (SSDL) 中定义)。

    3. 更新映射内容(此内容在映射规范语言 (MSL) 中定义)。

    4. 验证更新后的模型和映射内容。

    5. 防止 Visual Studio 生成对象层。

    说明 说明:

    实体数据模型工具还可以生成基于存储架构定义 (SSDL) 内容创建新数据库的脚本。在此情况下,您可以创建与自定义数据类匹配的数据模型,然后基于 .edmx 文件创建新数据库。有关更多信息,请参见 如何:根据概念模型生成数据库(实体数据模型工具)

    本主题说明如何使用 ADO.NET 实体数据模型设计器(实体设计器)或 EDM 生成器 (EdmGen.exe) 实用工具来更新模型。 若要运行本主题中的示例,您必须已经生成了模型。此示例中的模型基于 AdventureWorks 数据库中的 ContactSalesOrderHeaderSalesOrderDetail 表。 有关创建新模型的信息,请参见 如何:使用实体数据模型向导(实体框架)如何:使用 EdmGen.exe 生成模型和映射文件还必须将 ContactOrdersLineItem 自定义数据类(它们映射到 ContactSalesOrderHeaderSalesOrderDetail 表)添加到您的项目。 若要定义 ContactOrdersLineItem 自定义数据类,请参见 如何:定义 POCO 实体(实体框架)

    下面的过程假定您已在实体设计器中打开一个 .edmx 文件。

    使用实体数据模型设计器修改模型。

    1. 重命名 EntityTypeEntitySet 元素以反映自定义数据类的名称。

      • 选择 “联系人”实体。 “属性”窗口中,将 “实体集名称”设置为 ContactSet

      • 选择 “SalesOrderHeader”实体。 “属性”窗口中,将 “名称”设置为 Order 并将 “实体集名称”设置为 OrderSet

      • 选择 “SalesOrderDetails”“属性”窗口中,将 “名称”设置为 LineItem 并将 Entity Set Name设置为 LineItemSet

    2. 更改导航属性的名称。

      • 选择 “联系人”实体的 “SalesOrderHeaders”导航属性。 “属性”窗口中,将 “名称”设置为 Orders

      • 选择 “SalesOrderHeader”实体的 “SalesOrderDetails”导航属性。 “属性”窗口中,将 “名称”设置为 LineItems

      • 选择 “SalesOrderDetail”实体的 “SalesOrderHeader”导航属性。 “属性”窗口中,将 “名称”设置为 Order

    3. 更改关联。

      • 选择 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

    4. 从 Order 实体类型的属性中创建复杂类型。

      • 选择 “Order”实体的以下属性: “AccountNumber”“Comment”“PurchaseOrderNumber”“SalesOrderNumber”,然后右键单击并选择 “创建复杂类型”

        具有选定属性的新的复杂类型将添加到 “模型浏览器”新的复杂类型属性将添加到 SalesOrderHeader 实体。 复杂类型和复杂类型属性具有默认名称。

      • 将复杂类型重命名为 OrderInfo

      • 将复杂类型属性重命名为 ExtendedInfo

    5. 保存对 .edmx 文件所做的更改。

    6. 禁用 .edmx 文件的代码生成。ADO.NET 实体数据模型设计器(实体设计器)中打开 .edmx 文件。 右击设计器图面并选择“属性”。“属性”窗口中选择 “代码生成策略”属性,并选择 None如果 “属性”窗口不可见,请按 F4。

    使用 EdmGen.exe 修改模型。

    1. 在 Visual Studio 或文本编辑器中打开 CSDL 文件。

      • 重命名 EntityTypeEntitySet 元素以反映自定义数据类的名称。

      • 重命名每个类型的 Property 元素,以与自定义数据类中属性的名称相匹配。

      • 对于自定义数据类中不存在的任何属性,删除 Property 元素。

      • 重命名 NavigationProperty 元素,以与自定义数据类中导航属性的名称相匹配。 确保 FromRoleToRole 指向正确的实体类型。

      • 保存对 .csdl 文件所做的更改。

    2. 在 Visual Studio 或文本编辑器中打开 MSL 文件。

      • 重命名 EntitySetMapping 元素和 TypeName 特性以反映自定义类的名称。

      • 对于任何不具备相应的自定义数据类的实体,删除 EntitySetMapping 元素。

      • 重命名每个类型的 ScalarProperty 元素,以与自定义数据类中属性的名称相匹配。

      • 对于自定义数据类中不存在的任何属性,删除 ScalarProperty 元素。

      • 保存对 .msl 文件所做的更改。

    3. 在 Visual Studio 或文本编辑器中打开 SSDL 文件。

      • 对于未映射到自定义数据类的任何实体,删除 EntityType 元素。

      • 对于未映射到自定义数据类的属性的任何属性,删除 ScalarProperty 元素。

      • 保存对 .ssdl 文件所做的更改。

    4. 通过在包含映射文件的目录中运行 EdmGen.exe 实用工具,验证更新后的映射文件。

      • 使用以下命令:

        %windir%\Microsoft.NET\Framework\v4\edmgen.exe /mode:ValidateArtifacts  
        /inssdl:.\YourModel.ssdl /inmsl:.\YourModel.msl /incsdl:.\YourModel.csdl
      说明 说明:

      删除换行符并将 YourModel 替换为用于映射文件的名称。

      • 检查输出并修复任何验证错误。

    5. 重新生成、保存和删除自动生成的对象代码。

      • 在 Visual Studio 的 “解决方案资源管理器”中,右键单击 .csdl 文件并选择 “运行自定义工具”

      • 此时将基于修改后的 .csdl 文件重新生成对象层。

      • 展开 .csdl 文件节点,打开设计器文件,将文件另存为不同的文件名。

        此时将保存自动生成的对象层文件。来自此文件的代码在 如何:定义自定义对象上下文(实体框架)主题中使用。

      • 从项目中排除设计器文件。

      • 选择 .csdl 文件,并在 “属性”窗口中清除 “自定义工具”值。

        此时将防止重新生成对象层文件。若要在将来生成此文件,请在 “属性”窗口中为 “自定义工具”键入 EntityModelCodeGenerator,然后重复步骤 1。

    示例

    以下 .csdl 文件已自定义以支持 ContactOrdersLineItem 自定义数据类。

    <Schema Namespace="AdventureWorksModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://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 文件已自定义,以将 ContactOrdersLineItem 自定义数据类映射到 AdventureWorks 数据库中的 ContactSalesOrderHeaderSalesOrderDetail 表。

    <Mapping Space="C-S" xmlns="http://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 数据库中的 ContactSalesOrderHeaderSalesOrderDetail 表支持 ContactOrdersLineItem 自定义数据类。

    <Schema Namespace="AdventureWorksModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://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>
    
    
    请参见

    概念

    其他资源

  • 相关阅读:
    Quartz cron表达式
    Apache NiFi 核心概念和关键特性
    Hive llap服务安装说明及测试(一)
    nifi生产环境使用
    DataX 中Transformer的使用
    vue2.0之过渡动画,分别用钩子函数,animated,原生css实现(前端网备份)
    js对对象数组的某一字段排序(前端网备份)
    浏览器之禁扒(前端网备份)
    iframe 从父像子穿参数(前端网备份)
    关于小程序仿微博导航效果(前端网备份 )
  • 原文地址:https://www.cnblogs.com/bmate/p/1920997.html
Copyright © 2011-2022 走看看