【ASP.NET Web API教程】2.3.2 创建域模型

简介: 原文:【ASP.NET Web API教程】2.3.2 创建域模型Part 2: Creating the Domain Models 第2部分:创建域模型 本文引自:http://www.asp.
原文: 【ASP.NET Web API教程】2.3.2 创建域模型

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:
有三种方式使用实体框架:

  • Database-first: You start with a database, and Entity Framework generates the code.
    Database-first(数据库先行):从一个数据库开始,然后实体框架生成相应代码。
  • Model-first: You start with a visual model, and Entity Framework generates both the database and code.
    Model-first(模型先行):先从一个可视化模型开始,然后实体框架生成数据库和代码。
  • 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 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。然而,这并不意味着你应当总是把实体框架模型直接暴露给客户端,就像我们稍后在本教程所看到的那样。

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所示)。

WebAPI2-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属性必须是一个非空字符串。

注:本文把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的属性。实体框架将会推断出这些属性表示的是外键,并会把外键约束添加到数据库(见图2-15)。

WebAPI2-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输出。默认地,这两种格式化都会按值序列化所有对象。

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。更多信息参阅“处理循环对象引用”(本教程的第6部分 — 译者注)。

目录
相关文章
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
25 0
|
1月前
|
数据采集 监控 安全
各种业务场景调用API代理的API接口教程
API代理的API接口在各种业务场景中具有广泛的应用,本文将介绍哪些业务场景可以使用API代理的API接口,并提供详细的调用教程和代码演示,同时,我们还将讨论在不同场景下使用API代理的API接口所带来的好处。
|
2月前
|
IDE Java API
使用Java Web技术构建RESTful API的实践指南
使用Java Web技术构建RESTful API的实践指南
|
2月前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
64 2
|
27天前
|
API
2024常用Web支付开发讲解教程
本教程为web支付开发,讲解了最常用的两钟支付:支付宝支付和微信支付,服务器配置和API对接,学完本课程可以学会微信支付、和支付宝支付开发。
18 2
2024常用Web支付开发讲解教程
|
27天前
|
架构师 前端开发
web全栈架构师第16期教程
互联网时代已进入后半场,行业环境发生了显著变化。互联网人,尤其是技术人员,如何在加速更迭的技术浪潮中持续充电,提升自身价值,是当下必须面对的挑战。课程涉及了现下前端实际开发时所需要的各块内容,并深度对标 阿里 P6+级别所具备的知识储备及开发技能,奠定源码阅读基础和全栈开发能力。
19 3
web全栈架构师第16期教程
|
29天前
|
安全 API 数据安全/隐私保护
email api接口配置教程步骤详解
Email API是用于程序化访问邮件服务的工具,让开发者能集成邮件功能到应用中。配置Email API包括选择供应商(如SendGrid、Mailgun、AokSend),注册获取API密钥,配置API参数,及测试邮件发送。使用Email API能提升邮件发送的可靠性和效率,便于邮件管理及营销活动。AokSend支持大量验证码发送,适合高效邮件运营。
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
57 0

热门文章

最新文章