详细介绍ASP.NET Web API教程中创建领域模型的方法
添加模型有三种方法接近实体框架:有三种方法使用实体框架:数据库-首先:您从数据库开始,然后实体框架生成代码。数据库优先:从数据库开始,然后实体框架生成相应的代码。模型优先:您从一个可视化模型开始,实体框架生成数据库和代码。模型优先:从可视化模型开始,然后实体框架生成数据库和代码。代码优先:您从代码开始,实体框架生成数据库。代码优先:首先从代码开始,然后实体框架生成数据库。我们使用的是代码优先的方法,所以我们从将我们的域对象定义为概念验证对象开始。使用代码优先的方法,域对象不需要任何额外的代码来支持数据库层,例如事务或持久性。(具体来说,它们不需要从EntityObject类继承。)您仍然可以使用数据注释来控制实体框架如何创建数据库模式。我们打算使用代码优先的方法,所以我们首先将域对象定义为poco(普通旧的CLR对象)。很多人不太理解POCO对象。其实和文本文件一样,它是最简单最原始的对象,没有任何格式。因此,在各种环境中处理这样的对象是最容易的,包括各种语言。使用代码优先方法,域对象不需要任何额外的代码来支持数据库层,例如事务处理和持久性。(特别是,它们不需要从EntityObject类继承。您仍然可以使用数据注释来控制实体框架如何创建数据库方案。因为POCOs不携带任何描述数据库状态的额外属性,所以它们可以很容易地序列化为JSON或XML。然而,这并不意味着您应该总是直接向客户端公开您的实体框架模型,正如我们将在本教程后面看到的那样。因为POCO没有任何描述数据库状态的附加属性,所以它们可以很容易地序列化为JSON或XML。然而,这并不意味着您应该总是直接向客户端公开实体框架模型,正如我们将在本教程后面看到的那样。将创建以下pocos :我们将创建以下poco:产品订单订单详细信息要创建每个类,请右键单击解决方案资源管理器中的“模型”文件夹。从上下文菜单中,选择添加,然后选择类。要创建每个类,请右键单击解决方案资源管理器中的模型文件夹。从上下文菜单中选择添加,然后选择类(如图2-14所示)。
图2-14.创建少类添加具有以下实现的产品类:用以下实现添加一个产品类(产品类): 复制代码代码如下:命名空间产品存储。模型{使用系统。组件模型。数据注释;公共类产品{[ScafoldColumn(false)]公共int Id { get设置;}[必选]公共字符串名称{获取设置;}公共十进制价格{获取设置;}公共十进制实际成本{获取设置;} } }按照惯例,实体框架使用身份属性作为主键,并将其映射到数据库表中的标识列。创建新的产品实例时,不会为标识设置值,因为数据库会生成该值。根据约定,实体框架用身份属性作为主键,并把它映射成数据库表中的标识列。当创建一个新的产品实例时,不必为身份设置值,因为数据库会生成它脚手架立柱属性告诉ASP。NET MVC在生成编辑器表单时跳过身份属性。必需属性用于验证模型。它指定名称属性必须是非空字符串。脚手架柱(支架列)注解属性是告诉ASP .NET MVC,在生成编辑表单时,跳过这个身份属性必需的注解属性用于对模型进行验证。它指定名字属性必须是一个非空字符串。注:本文把脚手架列,必需等这一类英文中叫做注释属性的属性(属性)译为注解属性(注释属性),以便与类中的那些属性加以区别— 译者注添加订单类别:添加命令类(订单类): 复制代码代码如下:命名空间产品存储。模型{使用系统。集合。通用;使用系统。组件模型。数据注释;公共类Order { public int Id { get设置;}[必需]公共字符串客户{获取设置;} //导航属性/导航属性public ICollectionOrderDetail订单详细信息{ get设置;} } }添加订单明细类:添加订单明细类(订单细节类,或订单详情类): 复制代码代码如下:命名空间产品存储。模型{公共类OrderDetail { public int Id { get设置;}公共整数数量{ get设置;} public int OrderId { get设置;} public int ProductId { get设置;} //导航属性公共产品产品{获取设置;}公共秩序秩序{获取设置;} } }外键关系外键关系一个订单包含许多订单详细信息,每个订单详细信息都指向一个产品。为了表示这些关系,订单明细类定义了名为OrderId和ProductId的属性。实体框架将推断这些属性表示外键,并将向数据库添加外键约束。一份订单包含很多订单细节,而每个订单细节指向一个单一的产品。为了表示这些关系,订单明细类定义了名称为OrderId和ProductId的属性。实体框架将会推断出这些属性表示的是外键,并会把外键约束添加到数据库(见图2-15)。
图2-15.外键关系命令和订单明细类还包括"导航"属性,其中包含对相关对象的引用。给定订单,您可以按照导航属性导航到订单中的产品。命令和订单明细类也包含了"导航(导航)"属性,导航属性包含了对相关对象的引用。对于一份给定的订单,可以根据导航属性导航到这份订单的产品立即编译项目。实体框架使用反射来发现模型的属性,因此它需要一个编译过的程序集来创建数据库模式。现在,编译这个项目。实体框架会使用反射来发现这些模型的属性,因此它需要编译后的程序集来创建相应的数据库方案(这里的数据库方案意指数据库、表结构以及关系等数据库方面的定义— 译者注)。配置媒体类型格式化程序配置媒体类型格式化器媒体类型格式化程序是一个对象,它在网络应用编程接口写入超文本传送协议响应正文时序列化您的数据。内置的格式化程序支持JSON和可扩展置标语言输出。默认情况下,这两种格式化程序都按值序列化所有对象。媒体类型(媒体类型)格式化器是网络应用编程接口书写超文本传送协议响应体时对数据进行序列化的一个对象。内建的格式化器支持JSON和可扩展置标语言输出。默认地,这两种格式化都会按值序列化所有对象如果对象图包含循环引用,按值序列化会产生问题订单和订单明细类就是这种情况,因为每个类都持有对另一个类的引用。格式化程序将跟随引用,按值写入每个对象,然后循环执行。因此,我们需要改变默认行为。如果对象图含有循环引用,按值序列化会出现问题。这恰好是命令类和订单明细类的情况,因为每一个都含有对另一个的引用。格式化器会遵循这些引用,按值写出每一个对象,于是会引起循环。因此,我们需要修改这种默认行为在解决方案资源管理器中,展开应用程序_开始文件夹并打开名为WebApiConfig.cs的文件。将以下代码添加到WebApiConfig类:在"解决方案资源管理器"中,展开应用程序_开始文件夹,并打开名为WebApiConfig.cs的文件。将以下代码添加到这个WebApiConfig.cs类中(以下代码中的"新代码" — 译者注): 复制代码代码如下:公共静态类WebApiConfig {公共静态无效寄存器(HttpCONFIGuration config){ config .路线。MapHttpRoute(名称: ' DefaultAPI ',route templates : ' API/{ controller }/{ id } ',默认值3360 new { id=RouteParameter .可选});//新代码: //新代码:var json=config .格式化程序json .序列化程序设置。preservereferencesshandling=Newtonsoft .JSON。preservereferencesshandling。对象;配置。格式化程序。删除(配置格式化程序。XMLFformatter);} }这段代码将JSON格式化程序设置为保留对象引用,并将可扩展置标语言格式化程序从管道中完全移除。(您可以配置可扩展置标语言格式化程序来保留对象引用,但是这需要做更多的工作,我们只需要这个应用程序的JSON .有关更多信息,请参见处理循环对象引用。)这段代码把JSON格式化器设置为防止对象引用("新代码"第二行的作用— 译者注),并把可扩展置标语言格式化器从管线(指超文本传送协议的请求处理管线— 译者注)中完全删除("新代码"最后一行的作用— 译者注)。(你也可以把可扩展置标语言格式化器配置成防止对象引用,但这还要做一点工作,而对于这个应用程序,我们只需要JSON。更多信息参阅"处理循环对象引用"
版权声明:详细介绍ASP.NET Web API教程中创建领域模型的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。