Share via


HOW TO:自訂 Entity Data Model 以搭配自訂物件運作 (Entity Framework)

如果您想要搭配 實體資料模型 (EDM) 使用自訂資料類別,則概念結構定義語言 (CSDL) 檔案中所定義的實體類型和屬性必須符合自訂資料類別。實體架構 工具會產生一組對應檔案,其中 CSDL 檔案內的實體類型和實體集會符合資料庫中的資料表。針對自訂資料類別更新這些對應檔的程序如下所示:

  1. 更新 CSDL 檔案,使其符合自訂資料類別。

  2. 更新對應規格語言 (MSL) 檔案中的對應。

  3. 在必要時更新存放結構定義語言 (SSDL) 檔案。

  4. 驗證更新的對應檔。

  5. 阻止 Visual Studio 產生物件層。

若要執行本主題中的範例,必須先使用 EDM 產生器 (EdmGen.exe) 公用程式或 Entity Data Model 精靈 產生 EDM 對應檔案。如需詳細資訊,請參閱 HOW TO:使用 EdmGen.exe 產生 Entity Data Model (Entity Framework)。如果您要在 Visual Studio 中使用 Entity Data Model Designer,您也必須停用以更新的 CSDL 檔案為依據的物件層產生。否則,您的專案中將會有重複的資料類別。

若要更新 CSDL 檔案來反映自訂資料物件

  1. 使用 Visual Studio 或 notepad.exe 開啟 CSDL 檔案。

  2. 重新命名 EntityTypeEntitySet 元素,以反映自訂資料類別的名稱。

  3. 針對沒有對應自訂資料類別的任何實體移除 EntityTypeEntitySet 元素。

  4. 重新命名每一個型別的 Property 元素,使其符合自訂資料類別中的屬性名稱。

  5. 針對不存在於自訂資料類別中的任何屬性移除 Property 元素。

  6. 將變更儲存到 CSDL 檔案。

若要更新 MSL 檔案,將自訂資料物件對應到資料來源中的物件

  1. 使用 Visual Studio 或 notepad.exe 開啟 MSL 檔案。

  2. 重新命名 EntitySetMapping 元素和 TypeName 屬性,以反映自訂類別的名稱。

  3. 針對沒有對應自訂資料類別的任何實體移除 EntitySetMapping 元素。

  4. 重新命名每一個型別的 ScalarProperty 元素,使其符合自訂資料類別中的屬性名稱。

  5. 針對不存在於自訂資料類別中的任何屬性移除 ScalarProperty 元素。

  6. 重新命名 AssociationSetMapping 中的 EndProperty 元素,以反映自訂類別的名稱。

  7. 重新命名每一個 AssociationSetMapping 中的 ScalarProperty 元素,使其符合自訂資料類別中的屬性名稱。

    Note附註

    請勿變更任何 ColumnName 屬性。

  8. 針對不存在於自訂資料類別中的任何實體之間的關聯移除 AssociationSetMapping 元素。

  9. 將變更儲存到 MSL 檔案。

若要更新 SSDL 檔案,以便移除不存在於自訂資料類別中的實體

  1. 使用 Visual Studio 或 notepad.exe 開啟 SSDL 檔案。

  2. 針對未對應到自訂資料類別的任何實體移除 EntityType 元素。

  3. 針對未對應到自訂資料類別之屬性的任何屬性移除 ScalarProperty 元素。

  4. 將變更儲存到 SSDL 檔案。

若要驗證更新的對應檔

  1. 在包含對應檔的目錄中執行 EdmGen.exe 公用程式。請使用以下命令:

    %windir%\Microsoft.NET\Framework\v3.5\edmgen.exe /mode:ValidateArtifacts  
    /inssdl:.\YourModel.ssdl /inmsl:.\YourModel.msl /incsdl:.\YourModel.csdl 
    
    Note附註

    移除分行符號,並使用對應檔的名稱取代 YourModel

  2. 檢閱輸出,並修復任何驗證錯誤。

若要重新產生、儲存及移除自動產生的物件程式碼

  1. 在 Visual Studio 的 [方案總管] 中,以滑鼠右鍵按一下 CSDL**檔案,並選取 [執行自訂工具]。

    這樣會根據修改過的 CSDL 檔案重新產生物件層。

  2. 展開 CSDL 檔案節點、開啟設計工具檔案,並將檔案另存為不同的檔案名稱。

    這樣會儲存自動產生的物件層檔案。這個檔案的程式碼使用在 HOW TO:使用物件服務搭配自訂物件 (Entity Framework) 主題中。

  3. 從專案中排除此設計工具檔案。

  4. 選取 CSDL 檔案,並在 [屬性] 視窗中清除 [自訂工具] 的值。

    這樣會阻止物件層檔案的重新產生。如果未來要產生這個檔案,請在 [屬性] 視窗中針對 [自訂工具] 輸入 EntityModelCodeGenerator,然後重複步驟 1。

範例

下列 CSDL 檔案已經過自訂,可支援 OrdersLineItem 自訂資料類別。

<Schema Namespace="Microsoft.Samples.Edm" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SalesOrdersEntities">
    <EntitySet Name="LineItem" EntityType="Microsoft.Samples.Edm.LineItem" />
    <EntitySet Name="Order" EntityType="Microsoft.Samples.Edm.Order" />
    <AssociationSet Name="FK_LineItem_Order_OrderId" Association="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId">
      <End Role="Order" EntitySet="Order" />
      <End Role="LineItem" EntitySet="LineItem" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="LineItem">
    <Key>
      <PropertyRef Name="LineItemId" />
    </Key>
    <Property Name="LineItemId" Type="Int32" Nullable="false" />
    <Property Name="TrackingNumber" Type="String" MaxLength="25" />
    <Property Name="Quantity" Type="Int16" Nullable="false" />
    <Property Name="Product" Type="Int32" Nullable="false" />
    <Property Name="Price" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="Discount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <NavigationProperty Name="Order" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="LineItem" ToRole="Order" />
  </EntityType>
  <EntityType Name="Order">
    <Key>
      <PropertyRef Name="OrderId" />
    </Key>
    <Property Name="OrderId" Type="Int32" 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="Customer" Type="Int32" Nullable="false" />
    <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="ExtendedInfo" Type="Self.OrderInfo" Nullable="false" />
    <NavigationProperty Name="LineItem" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="Order" ToRole="LineItem" />
  </EntityType>
    <ComplexType Name="OrderInfo">
        <Property Name="OrderNumber" Type="String" Nullable="false" MaxLength="25" />
        <Property Name="PurchaseOrder" Type="String" MaxLength="25" />
        <Property Name="AccountNumber" Type="String" MaxLength="15" />
        <Property Name="Comment" Type="String" MaxLength="128" />
    </ComplexType>
  <Association Name="FK_LineItem_Order_OrderId">
    <End Role="Order" Type="Microsoft.Samples.Edm.Order" Multiplicity="1" />
    <End Role="LineItem" Type="Microsoft.Samples.Edm.LineItem" Multiplicity="*" />
  </Association>
</Schema>

下列 MSL 檔案已經過自訂,可將 OrdersLineItem 自訂資料類別對應到 AdventureWorks 資料庫中的 SalesOrderHeaderSalesOrderDetail 資料表。

<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="Sales" CdmEntityContainer="SalesOrdersEntities">
    <EntitySetMapping Name="LineItem" StoreEntitySet="SalesOrderDetail" TypeName="Microsoft.Samples.Edm.LineItem">
      <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      <ScalarProperty Name="TrackingNumber" ColumnName="CarrierTrackingNumber" />
      <ScalarProperty Name="Quantity" ColumnName="OrderQty" />
      <ScalarProperty Name="Product" ColumnName="ProductID" />
      <ScalarProperty Name="Price" ColumnName="UnitPrice" />
      <ScalarProperty Name="Discount" ColumnName="UnitPriceDiscount" />
    </EntitySetMapping>
    <EntitySetMapping Name="Order" StoreEntitySet="SalesOrderHeader" TypeName="Microsoft.Samples.Edm.Order">
      <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
      <ScalarProperty Name="DueDate" ColumnName="DueDate" />
      <ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
      <ScalarProperty Name="Status" ColumnName="Status" />
      <ScalarProperty Name="Customer" ColumnName="CustomerID" />
      <ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
      <ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
      <ScalarProperty Name="Freight" ColumnName="Freight" />
      <ComplexProperty Name ="ExtendedInfo" TypeName ="Microsoft.Samples.Edm.OrderInfo">
        <ScalarProperty Name="OrderNumber" ColumnName="SalesOrderNumber" />
        <ScalarProperty Name="PurchaseOrder" ColumnName="PurchaseOrderNumber" />
        <ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
        <ScalarProperty Name="Comment" ColumnName="Comment" />
      </ComplexProperty>
    </EntitySetMapping>
    <AssociationSetMapping Name="FK_LineItem_Order_OrderId" TypeName="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" StoreEntitySet="SalesOrderDetail">
      <EndProperty Name="Order">
        <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      </EndProperty>
      <EndProperty Name="LineItem">
        <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      </EndProperty>
      <Condition ColumnName="SalesOrderID" IsNull="false" />
    </AssociationSetMapping>
  </EntityContainerMapping>
</Mapping>

下列 SSDL 檔案已經過自訂,可支援使用 AdventureWorks 資料庫中 SalesOrderHeaderSalesOrderDetail 資料表的 OrdersLineItem 自訂資料類別。

<Schema Namespace="Microsoft.Samples.Edm.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="Sales">
    <EntitySet Name="SalesOrderDetail" EntityType="Microsoft.Samples.Edm.Store.SalesOrderDetail" />
    <EntitySet Name="SalesOrderHeader" EntityType="Microsoft.Samples.Edm.Store.SalesOrderHeader" />
    <AssociationSet Name="FK_LineItem_Orders_OrderId" Association="Microsoft.Samples.Edm.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
      <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
      <End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="SalesOrderDetail">
    <Key>
      <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="UnitPrice" Type="money" Nullable="false" />
    <Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
  </EntityType>
  <EntityType Name="SalesOrderHeader">
    <Key>
      <PropertyRef Name="SalesOrderID" />
    </Key>
    <Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
    <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="SalesOrderNumber" Type="nvarchar" Nullable="false" StoreGeneratedPattern="Computed" MaxLength="25" />
    <Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
    <Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
    <Property Name="CustomerID" Type="int" Nullable="false" />
    <Property Name="SubTotal" Type="money" Nullable="false" />
    <Property Name="TaxAmt" Type="money" Nullable="false" />
    <Property Name="Freight" Type="money" Nullable="false" />
    <Property Name="Comment" Type="nvarchar" MaxLength="128" />
  </EntityType>
  <Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
    <End Role="SalesOrderHeader" Type="Microsoft.Samples.Edm.Store.SalesOrderHeader" Multiplicity="1" />
    <End Role="SalesOrderDetail" Type="Microsoft.Samples.Edm.Store.SalesOrderDetail" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="SalesOrderHeader">
        <PropertyRef Name="SalesOrderID" />
      </Principal>
      <Dependent Role="SalesOrderDetail">
        <PropertyRef Name="SalesOrderID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>

另請參閱

概念

自訂物件 (Entity Framework)

其他資源

結構描述和對應規格 (Entity Framework)
處理自訂物件 (Entity Framework 工作)