ASP.NET Web API教程 建立領域模型的方法詳細介紹

來源:互聯網
上載者:User

添加模型
There are three ways to approach Entity Framework:
有三種方式使用Entity Framework:
Database-first: You start with a database, and Entity Framework generates the code.
Database-first(資料庫先行):從一個資料庫開始,然後Entity Framework產生相應代碼。
Model-first: You start with a visual model, and Entity Framework generates both the database and code.
Model-first(模型先行):先從一個可視化模型開始,然後Entity Framework產生資料庫和代碼。
Code-first: You start with code, and Entity Framework generates the database.
Code-first(代碼先行):先從代碼開始,然後Entity Framework產生資料庫。
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)對Entity Framework如何建立資料庫方案進行控制。
Because POCOs do not carry any extra properties that describe database state, they can easily be serialized to JSON or XML. However, that does not mean you should always expose your Entity Framework models directly to clients, as we'll see later in the tutorial.
由於POCO不帶描述資料庫狀態的任何附加屬性,它們可以很容易地被序列化成JSON或XML。然而,這並不意味著你應當總是把Entity Framework模型直接暴露給用戶端,就像我們稍後在本教程所看到的那樣。

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類(產品類): 複製代碼 代碼如下: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.
根據約定,Entity Framework用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屬性必須是一個非Null 字元串。
註:本文把ScaffoldConlumn、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.
一份訂單包含很多訂單細節,而每個訂單細節指向一個單一的產品。為了表示這些關係,OrderDetail類定義了名稱為OrderId和ProductId的屬性。Entity Framework將會推斷出這些屬性工作表示的是外鍵,並會把外鍵約束添加到資料庫(見圖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.
現在,編譯這個項目。Entity Framework會使用反射來發現這些模型的屬性,因此它需要編譯後的程式集來建立相應的資料庫方案(這裡的資料庫方案意指資料庫、表結構以及關係等資料庫方面的定義 — 譯者注)。
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輸出。預設地,這兩種格式化都會按值序列化所有對象。
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格式化器設定為防止對象引用(“新代碼”第二行的作用 — 譯者注),並把XML格式化器從管線(指HTTP的請求處理管線 — 譯者注)中完全刪除(“新代碼”最後一行的作用 — 譯者注)。(你也可以把XML格式化器配置成防止對象引用,但這還要做一點工作,而對於這個應用程式,我們只需要JSON。更多資訊參閱“處理迴圈對象引用”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.