【ASP.NET Web APIチュートリアル】2.3.2ドメインモデルの作成
8958 ワード
Part 2:Creating the Domain Modelsパート2:ドメインモデルの作成
この文書は次のとおりです.http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-fram ework/using-web-api-with-entity-framework,-part-2
Add Modelsモデルの追加
There are three ways to approach Entity Framework:エンティティ・フレームワークを使用するには、次の3つの方法があります. Database-first:You start with a database,and Entity Framework generates the code.Database-first(データベース先行):1つのデータベースから開始し、エンティティフレームワークは対応するコードを生成します. Model-first:You start with a visual model,and Entity Framework generates both the database and code.Model-first(モデル先行):まず1つの可視化モデルから開始し、エンティティフレームワークはデータベースとコードを生成します. Code-first:You start with code,and Entity Framework generates the database.Code-first(コード先行):コードから開始し、エンティティ・フレームワークからデータベースを生成します.
We are using the code-first approach, so we start by defining our domain objects as POCOs (plain-old CLR objects). With the code-first approach, domain objects don't need any extra code to support the database layer, such as transactions or persistence. (Specifically, they do not need to inherit from the EntityObject class.)You can still use data annotations to control how Entity Framework creates the database schema.code-firstメソッドを使用する予定なので、まずドメインオブジェクトをPOCO(plain-old CLR objects-旧式非フォーマット共通言語実行時(CLR)と定義します.オブジェクト.多くの人がPOCOオブジェクトをあまり理解していないが、このオブジェクトはテキストファイルのように最も簡単で、最も原始的で、フォーマットを持たないオブジェクトである.そのため、様々な環境の中でこのようなオブジェクトを最も容易に処理することができ、様々な言語で処理することを含む-訳者注).code-firstメソッドを使用すると、トランザクション、永続化などのデータベース・レイヤをサポートする追加のコードはドメイン・オブジェクトに必要ありません.(特に、EntityObjectクラスに継承する必要はありません.)データ注記(data annotation)を使用して、エンティティ・フレームワークがデータベース・スキーマを作成する方法を制御できます.
Because POCOs do not carry any extra properties that describe database state,they can easily be serialized to JSON.However,that does not mean you should always expose your Entity Framework models directly to clients,as we'll see later in the tutorial.JSONまたはXMLに簡単にシーケンス化できます.しかし、これは、後でこのチュートリアルで見たように、エンティティ・フレームワーク・モデルをクライアントに直接露出する必要があるという意味ではありません.
We will create the following POCOs:次のPOCOを作成します. Product Order OrderDetail
To create each class,right-click the Models folder in Solution Explorer.From the context menu,select Add and then select Class.各クラスを作成するには、「ソリューションエクスプローラ」でModelsフォルダを右クリックします.コンテキストメニューから「追加」を選択し、図2-14に示すように「クラス」を選択します.
図2-14.POCOクラスの作成
Add a Product class with the following implementation:以下のインプリメンテーションでProductクラス(製品クラス)を追加します.
By convention,Entity Framework uses the Id property as the primary key and maps it to an identity column in the database table.When you create a new Product instance,you won’t set a value for Id,because the database generates the value.約束に従って、エンティティフレームワークはId属性をプライマリキーとしてデータベーステーブルの識別列にマッピングされる.新しいProductインスタンスを作成する場合は、データベースが生成するため、Idの値を設定する必要はありません.
The ScaffoldColumn attribute tells ASP.NET MVC to skip the Id property when generating an editor form.The Required attribute is used to validate the model.It specifies that the Name property must be a non-empty string.ScaffoldColumn(ブラケット列)注記属性はASP.NET MVCに伝え、編集フォームを生成する際にこのId属性をスキップする.Required注記プロパティは、モデルを検証するために使用されます.Nameプロパティが空でない文字列である必要があることを指定します.
注:ここではScaffoldConsumn、Requiredなどの英語でAnnotation Attributeという属性(Attribute)を注釈属性(Annotation Attribute)と訳して、クラスの属性と区別します.
Add the Order class:Orderクラス(受注クラス)の追加:
Add the OrderDetail class:OrderDetailクラス(受注詳細クラス、または受注詳細クラス)を追加します.
Foreign Key Relations外部キー関係
An order contains many order details, and each order detail refers to a single product. To represent these relations, the OrderDetail class defines properties named OrderId and ProductId. Entity Framework will infer that these properties represent foreign keys,and will add foreign-key constraints to the database.1つの注文には多くの注文詳細が含まれており、各注文詳細は単一の製品を指しています.これらの関係を表すために、OrderDetailクラスは、OrderIdとProductIdという名前の属性を定義します.エンティティ・フレームワークは、これらのプロパティが外部キーを表していると推定し、外部キー制約をデータベースに追加します(図2-15参照).
図2-15.外部キー関係
The Order and OrderDetail classes also include"navigation"properties,which contain references to the related objects.Given an order,you can navigate to the products in the order by following the navigation properties.OrderとOrderDetailクラスにも「ナビゲーション(navigation)」属性が含まれており、ナビゲーション属性には関連オブジェクトへの参照が含まれている.指定された受注の場合、ナビゲーション・プロパティに基づいて受注の製品にナビゲートできます.
Compile the project now.Entity Framework uses reflection to discover the properties of the models,so it requires a compiled assembly to create the database schema.このプロジェクトをコンパイルします.エンティティ・フレームワークは、反射を使用してモデルのプロパティを検出するため、コンパイルされたプログラム・セットを使用して対応するデータベース・スキーマを作成する必要があります(ここで、データベース・スキーマは、データベース、テーブル構造、リレーションシップなどのデータベースの定義-訳者注を意味します).
Configure the Media-type Formatters設定Media-typeフォーマッタ
A media-type formatter is an object that serializes your data when Web API writes the HTTP response body.The built-in formatters support JSON and XML output.By default,both of these formatters serialize all objects by value.media-type(メディアタイプ)フォーマッタは、Web APIがHTTP応答体を書くときにデータをシーケンス化するオブジェクトである.内蔵フォーマットはJSONとXML出力をサポートします.デフォルトでは、この2つのフォーマットはすべてのオブジェクトを値でシーケンス化します.
Serialization by value creates a problem if an object graph contains circular references. That's exactly the case with the Order and OrderDetail classes, because each holds a reference to the other. The formatter will follow the references, writing each object by value, and go in circles. Therefore,we need to change the default behavior.オブジェクトマップにループリファレンスが含まれている場合、値順にシーケンス化すると問題が発生します.これは、それぞれが別の参照を含んでいるため、OrderクラスとOrderDetailクラスの場合に適しています.フォーマットは、これらの参照に従い、各オブジェクトを値で書き出し、ループを引き起こします.そのため、このデフォルトの動作を変更する必要があります.
In Solution Explorer, expand the App_Start folder and open the file named WebApiConfig.cs.Add the following code to the WebApiConfig class:「ソリューションエクスプローラ」でApp_を展開Startフォルダを開き、WebApiConfig.csというファイルを開きます.このWebApiConfig.csクラスに次のコードを追加します(次のコードの「新しいコード」-訳者注).
This code sets the JSON formatter to preserve object references, and removes the XML formatter from the pipeline entirely. (You can configure the XML formatter to preserve object references, but it's a little more work, and we only need JSON for this application. For more information, see Handling Circular Object References .)このコードはJSONフォーマッタをオブジェクト参照(「新コード」2行目の役割-訳者注)を防止するように設定し、XMLフォーマッタをパイプライン(HTTPの要求処理パイプライン-訳者注)から完全に削除する(「新コード」の最後の行の役割-訳者注).(XMLフォーマットをオブジェクト参照を防止するように構成することもできますが、このアプリケーションではJSONのみが必要です.詳細は、「ループオブジェクト参照の処理」(このチュートリアルの第6部-訳者注)を参照してください.
この文書は次のとおりです.http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-fram ework/using-web-api-with-entity-framework,-part-2
Add Modelsモデルの追加
There are three ways to approach Entity Framework:エンティティ・フレームワークを使用するには、次の3つの方法があります.
We are using the code-first approach, so we start by defining our domain objects as POCOs (plain-old CLR objects). With the code-first approach, domain objects don't need any extra code to support the database layer, such as transactions or persistence. (Specifically, they do not need to inherit from the EntityObject class.)You can still use data annotations to control how Entity Framework creates the database schema.code-firstメソッドを使用する予定なので、まずドメインオブジェクトをPOCO(plain-old CLR objects-旧式非フォーマット共通言語実行時(CLR)と定義します.オブジェクト.多くの人がPOCOオブジェクトをあまり理解していないが、このオブジェクトはテキストファイルのように最も簡単で、最も原始的で、フォーマットを持たないオブジェクトである.そのため、様々な環境の中でこのようなオブジェクトを最も容易に処理することができ、様々な言語で処理することを含む-訳者注).code-firstメソッドを使用すると、トランザクション、永続化などのデータベース・レイヤをサポートする追加のコードはドメイン・オブジェクトに必要ありません.(特に、EntityObjectクラスに継承する必要はありません.)データ注記(data annotation)を使用して、エンティティ・フレームワークがデータベース・スキーマを作成する方法を制御できます.
Because POCOs do not carry any extra properties that describe database state,they can easily be serialized to JSON.However,that does not mean you should always expose your Entity Framework models directly to clients,as we'll see later in the tutorial.JSONまたはXMLに簡単にシーケンス化できます.しかし、これは、後でこのチュートリアルで見たように、エンティティ・フレームワーク・モデルをクライアントに直接露出する必要があるという意味ではありません.
We will create the following POCOs:次のPOCOを作成します.
To create each class,right-click the Models folder in Solution Explorer.From the context menu,select Add and then select Class.各クラスを作成するには、「ソリューションエクスプローラ」でModelsフォルダを右クリックします.コンテキストメニューから「追加」を選択し、図2-14に示すように「クラス」を選択します.
図2-14.POCOクラスの作成
Add a Product class with the following implementation:以下のインプリメンテーションでProductクラス(製品クラス)を追加します.
namespace ProductStore.Models
{
using System.ComponentModel.DataAnnotations;
public class Product
{
[ScaffoldColumn(false)]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public decimal Price { get; set; }
public decimal ActualCost { get; set; }
}
}
By convention,Entity Framework uses the Id property as the primary key and maps it to an identity column in the database table.When you create a new Product instance,you won’t set a value for Id,because the database generates the value.約束に従って、エンティティフレームワークはId属性をプライマリキーとしてデータベーステーブルの識別列にマッピングされる.新しいProductインスタンスを作成する場合は、データベースが生成するため、Idの値を設定する必要はありません.
The ScaffoldColumn attribute tells ASP.NET MVC to skip the Id property when generating an editor form.The Required attribute is used to validate the model.It specifies that the Name property must be a non-empty string.ScaffoldColumn(ブラケット列)注記属性はASP.NET MVCに伝え、編集フォームを生成する際にこのId属性をスキップする.Required注記プロパティは、モデルを検証するために使用されます.Nameプロパティが空でない文字列である必要があることを指定します.
注:ここではScaffoldConsumn、Requiredなどの英語でAnnotation Attributeという属性(Attribute)を注釈属性(Annotation Attribute)と訳して、クラスの属性と区別します.
Add the Order class:Orderクラス(受注クラス)の追加:
namespace ProductStore.Models
{
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Order
{
public int Id { get; set; }
[Required]
public string Customer { get; set; }
// Navigation property
//
public ICollection<OrderDetail> OrderDetails { get; set; }
}
}
Add the OrderDetail class:OrderDetailクラス(受注詳細クラス、または受注詳細クラス)を追加します.
namespace ProductStore.Models
{
public class OrderDetail
{
public int Id { get; set; }
public int Quantity { get; set; }
public int OrderId { get; set; }
public int ProductId { get; set; }
// Navigation properties
//
public Product Product { get; set; }
public Order Order { get; set; }
}
}
Foreign Key Relations外部キー関係
An order contains many order details, and each order detail refers to a single product. To represent these relations, the OrderDetail class defines properties named OrderId and ProductId. Entity Framework will infer that these properties represent foreign keys,and will add foreign-key constraints to the database.1つの注文には多くの注文詳細が含まれており、各注文詳細は単一の製品を指しています.これらの関係を表すために、OrderDetailクラスは、OrderIdとProductIdという名前の属性を定義します.エンティティ・フレームワークは、これらのプロパティが外部キーを表していると推定し、外部キー制約をデータベースに追加します(図2-15参照).
図2-15.外部キー関係
The Order and OrderDetail classes also include"navigation"properties,which contain references to the related objects.Given an order,you can navigate to the products in the order by following the navigation properties.OrderとOrderDetailクラスにも「ナビゲーション(navigation)」属性が含まれており、ナビゲーション属性には関連オブジェクトへの参照が含まれている.指定された受注の場合、ナビゲーション・プロパティに基づいて受注の製品にナビゲートできます.
Compile the project now.Entity Framework uses reflection to discover the properties of the models,so it requires a compiled assembly to create the database schema.このプロジェクトをコンパイルします.エンティティ・フレームワークは、反射を使用してモデルのプロパティを検出するため、コンパイルされたプログラム・セットを使用して対応するデータベース・スキーマを作成する必要があります(ここで、データベース・スキーマは、データベース、テーブル構造、リレーションシップなどのデータベースの定義-訳者注を意味します).
Configure the Media-type Formatters設定Media-typeフォーマッタ
A media-type formatter is an object that serializes your data when Web API writes the HTTP response body.The built-in formatters support JSON and XML output.By default,both of these formatters serialize all objects by value.media-type(メディアタイプ)フォーマッタは、Web APIがHTTP応答体を書くときにデータをシーケンス化するオブジェクトである.内蔵フォーマットはJSONとXML出力をサポートします.デフォルトでは、この2つのフォーマットはすべてのオブジェクトを値でシーケンス化します.
Serialization by value creates a problem if an object graph contains circular references. That's exactly the case with the Order and OrderDetail classes, because each holds a reference to the other. The formatter will follow the references, writing each object by value, and go in circles. Therefore,we need to change the default behavior.オブジェクトマップにループリファレンスが含まれている場合、値順にシーケンス化すると問題が発生します.これは、それぞれが別の参照を含んでいるため、OrderクラスとOrderDetailクラスの場合に適しています.フォーマットは、これらの参照に従い、各オブジェクトを値で書き出し、ループを引き起こします.そのため、このデフォルトの動作を変更する必要があります.
In Solution Explorer, expand the App_Start folder and open the file named WebApiConfig.cs.Add the following code to the WebApiConfig class:「ソリューションエクスプローラ」でApp_を展開Startフォルダを開き、WebApiConfig.csというファイルを開きます.このWebApiConfig.csクラスに次のコードを追加します(次のコードの「新しいコード」-訳者注).
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// New code:
// :
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
}
This code sets the JSON formatter to preserve object references, and removes the XML formatter from the pipeline entirely. (You can configure the XML formatter to preserve object references, but it's a little more work, and we only need JSON for this application. For more information, see Handling Circular Object References .)このコードはJSONフォーマッタをオブジェクト参照(「新コード」2行目の役割-訳者注)を防止するように設定し、XMLフォーマッタをパイプライン(HTTPの要求処理パイプライン-訳者注)から完全に削除する(「新コード」の最後の行の役割-訳者注).(XMLフォーマットをオブジェクト参照を防止するように構成することもできますが、このアプリケーションではJSONのみが必要です.詳細は、「ループオブジェクト参照の処理」(このチュートリアルの第6部-訳者注)を参照してください.