カスタム オブジェクトを操作できるように Entity Data Model をカスタマイズする方法 (Entity Framework)
エンティティ データ モデル (EDM) でカスタム データ クラスを使用する場合は、概念スキーマ定義言語 (CSDL) ファイルに定義されているエンティティの型およびプロパティがカスタム データ クラスと一致する必要があります。エンティティ フレームワーク ツールは、CSDL ファイル内のエンティティ型およびエンティティ セットと、データベース内のテーブルとが対応付けられたマッピング ファイルのセットを生成します。カスタム データ クラス用にこれらのマッピング ファイルを更新する手順を次に示します。
カスタム データ クラスに対応するように CSDL ファイルを更新します。
マッピング スキーマ言語 (MSL) ファイル内のマッピングを更新します。
必要に応じて、ストア スキーマ定義言語 (SSDL) ファイルを更新します。
更新されたマッピング ファイルを検証します。
Visual Studio によるオブジェクト レイヤの生成を停止します。
このトピックの例を実行するには、EDM ジェネレータ (EdmGen.exe) ユーティリティまたは Entity Data Model ウィザード を使用して、EDM マッピング ファイルを生成しておく必要があります。詳細については、「EdmGen.exe を使用して Entity Data Model を生成する方法 (Entity Framework)」を参照してください。Visual Studio で Entity Data Model Designer を使用する場合は、更新済みの CSDL ファイルに基づいたオブジェクト レイヤの生成を無効にすることも必要です。この操作を行わない場合、プロジェクトに重複するデータ クラスが存在することになります。
CSDL ファイルを更新してカスタム データ オブジェクトを反映するには
Visual Studio または notepad.exe を使用して CSDL ファイルを開きます。
カスタム データ クラスの名前を反映するように、EntityType 要素と EntitySet 要素の名前を変更します。
対応するカスタム データ クラスがないすべてのエンティティの EntityType 要素と EntitySet 要素を削除します。
カスタム データ クラスのプロパティの名前に対応するように、それぞれの型の Property 要素の名前を変更します。
カスタム データ クラスに存在しないすべてのプロパティの Property 要素を削除します。
変更内容を CSDL ファイルに保存します。
MSL ファイルを更新してカスタム データ オブジェクトをデータ ソース内のオブジェクトにマップするには
Visual Studio または notepad.exe を使用して MSL ファイルを開きます。
カスタム クラスの名前を反映するように、EntitySetMapping 要素と TypeName 属性の名前を変更します。
対応するカスタム データ クラスがないすべてのエンティティの EntitySetMapping 要素を削除します。
カスタム データ クラスのプロパティの名前に対応するように、それぞれの型の ScalarProperty 要素の名前を変更します。
カスタム データ クラスに存在しないすべてのプロパティの ScalarProperty 要素を削除します。
カスタム クラスの名前を反映するように、AssociationSetMapping 内の EndProperty 要素の名前を変更します。
カスタム データ クラスのプロパティの名前に対応するように、それぞれの AssociationSetMapping の ScalarProperty 要素の名前を変更します。
[!メモ]
ColumnName のプロパティは変更しないでください。
カスタム データ クラスに存在しないエンティティ間のアソシエーションの AssociationSetMapping 要素を削除します。
変更内容を MSL ファイルに保存します。
SSDL ファイルを更新してカスタム データ クラスに存在しないエンティティを削除するには
Visual Studio または notepad.exe を使用して SSDL ファイルを開きます。
カスタム データ クラスにマップされていないすべてのエンティティの EntityType 要素を削除します。
カスタム データ クラスのプロパティにマップされていないすべてのプロパティの ScalarProperty 要素を削除します。
変更内容を SSDL ファイルに保存します。
更新されたマッピング ファイルを検証するには
マッピング ファイルが格納されているディレクトリ内で EdmGen.exe ユーティリティを実行します。次のコマンドを使用します。
%windir%\Microsoft.NET\Framework\v3.5\edmgen.exe /mode:ValidateArtifacts /inssdl:.\YourModel.ssdl /inmsl:.\YourModel.msl /incsdl:.\YourModel.csdl
[!メモ]
改行を削除し、YourModel を対象のマッピング ファイルの名前で置き換えてください。
出力を確認し、検証エラーがあればエラーを修正します。
自動生成されたオブジェクト コードを再生成、保存、および削除するには
Visual Studio のソリューション エクスプローラで、CSDLファイルを右クリックし、[カスタム ツールの実行]** をクリックします。
これにより、変更された CSDL ファイルに基づいて、オブジェクト レイヤが生成されます。
CSDL ファイルのノードを展開し、デザイナ ファイルを開きます。ファイルに別の名前を付けて保存します。
これにより、自動生成されたオブジェクト レイヤ ファイルが保存されます。このファイルのコードは、トピック「カスタム オブジェクトで Object Services を使用する方法 (Entity Framework)」を参照してください。
デザイナ ファイルをプロジェクトから除外します。
CSDL ファイルを選択し、[プロパティ] ウィンドウの [カスタム ツール] 値を消去します。
これにより、オブジェクト レイヤ ファイルが再生成されなくなります。このファイルを後で生成するには、[プロパティ] ウィンドウの [カスタム ツール] に「EntityModelCodeGenerator」と入力し、手順 1. を繰り返します。
例
次の CSDL ファイルは、Orders カスタム データ クラスと LineItem カスタム データ クラスをサポートするようにカスタマイズされています。
<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 ファイルは、Orders カスタム データ クラスと LineItem カスタム データ クラスを AdventureWorks データベース内の SalesOrderHeader テーブルと SalesOrderDetail テーブルにマップするようにカスタマイズされています。
<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 データベース内の SalesOrderHeader テーブルと SalesOrderDetail テーブルを使用して Orders カスタム データ クラスと LineItem カスタム データ クラスをサポートするようにカスタマイズされています。
<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 タスク)