nopCommerce开发者指南(二):更新一个现有实体,添加新属性的方法。

原文链接:http://docs.nopcommerce.com/pages/viewpage.action?pageId=1442499

翻译 by:yersans,如有不妥,敬请指正,博主邮箱:zhanglei0591@qq.com。转载请注明出处。

 

本教程讲解如何在已发布的nopCommerce 源码中添加一个属性到Affiliate 实体。

 

数据模型

 

实体用两个类将记录映射到数据表中,第一个类定义所需的属性、字段和方法。

 

文件位置 [Project Root]LibrariesNop.CoreDomainAffiliatesAffiliate.cs 

程序集:Nop.Core 

解决方案位置:Nop.Core.Domain.Affiliates.Affilate.cs

 

第二个类将定义的属性映射到各自对应的SQL列上。这个类同样负责映射不同SQL表之间的关系。

 

文件位置:[Project Root]LibrariesNop.DataMappingAffiliatesAffiliateMap.cs 

程序集:Nop.Data 

解决方案位置: Nop.Data.Mapping.Affiliates.AffiliateMap.cs

 

把下面的属性添加到Affiliate 类中

 

// 数据表对象(如Affiliate.cs)的实例成员必须用virtual关键字修饰
// 数据访问框架要求使用Virtual关键字,以便能实现更多复杂的功能,如延迟加载等。

public virtual string AffiliateWebSite { get; set; }

 

将下面的代码添加到AffiliateMap 类的构造函数中

 

// 这段代码把我们上面创建的属性映射为数据库中的一列

// 它在 Affiliate 表中创建一个可空的最大长度为255个字符的nvchar类型字段

this.Property(m => m.AffiliateWebSite).HasMaxLength(255).IsOptional();    

 

 

现在,运行程序,重新安装数据库,检查相应的列是否已被正确创建。

(附言:经博主本人测试,删除项目数据库和 opCommercePresentationNop.WebApp_DataSettings.txt文件,清理并重新生成整个项目,然后运行项目,会提示用户重新安装,安装成功后,数据库相关字段即成功更新。你也可以使用自定义的SQL脚本更新数据库。参见文末故障排除部分的建议。)

 

表现层模型

 

表现层模型用来把信息从控制器传递到视图(了解更多请访问asp.net/mvc)。模型还有一个用途:定义要求。

我们的数据库配置只允许AffiliateWebSite字段存储255个字符以内大小的变量。如果我们尝试存储一个300个字符大小的变量,程序就会出错(或者会截短你输入的文本)。我们应当尽最大可能保护用户避免失败,视图模型有助于强制要求这些条件,例如字符串的最大长度。

 

文件位置:[Project Root]PresentationNop.WebAdministrationModelsAffiliatesAffiliateModel.cs 

程序集:Nop.Admin 

解决方案位置:Nop.Admin.Models.Affiliates.AffiliateModel.cs


验证类用来验证模型类中存储的数据(例如,非空字段,最大长度,和取值范围)。

 

文件位置:[Project Root]PresentationNop.WebAdministrationValidatorsAffiliatesAffiliateValidator.cs 

程序集: Nop.Admin 

解决方案位置:Nop.Admin.Validators.Affiliates.AffiliateValidator.cs


添加属性到视图模型

 

// NopResourceDisplayName 提供了本地化时所用的关键字,

// 我们的博客将会提供更多关于本地化的信息,请密切关注。

[NopResourceDisplayName("Admin.Affiliates.Fields.AffiliateWebSite")]

public string AffiliateWebSite { get; set; }

 

条件要求相关代码会被加入到对应validator类的构造函数中 

 

//我想这句代码本身就能说明它的作用吧

RuleFor(m => m.AffiliateWebSite).Length(0, 255);

 

视图

文件位置:[Project Root]PresentationNop.WebAdministrationViewsAffiliates _CreateOrUpdate.cshtml 

程序集:Nop.Admin 

解决方案位置:Nop.Admin.Views.Affiliates._CreateOrUpdate.cshtml



视图包含用来显示模型数据的html代码。请把这些html代码放在“活动的”区域内。

<tr>

    <td class="adminTitle">

        @Html.NopLabelFor(model => model.AffiliateWebSite):

    </td>

    <td class="adminData">

        @Html.EditorFor(model => model.AffiliateWebSite)

        @Html.ValidationMessageFor(model => model.Active)

    </td>

</tr>

 

控制器

 

本例中,控制器负责将领域数据模型映射为视图模型,反之亦然。我选择affiliate模型的原因是因为它简单。我希望本篇关于nopCommerce 的介绍尽可能简单。

 

文件位置:[Project Root]PresentationNop.WebAdministrationControllerssAffiliateController.cs 

程序集:Nop.Admin 

解决方案位置:Nop.Admin.Controllers.AffiliateController.cs



我们将对AffiliateController 做三个更新

  • 数据模型->视图模型
  • 创建视图模型->数据模型
  • 编辑视图模型->数据模型

通常我会在代码之后写一些测试,以确认模型映射正常工作,但是为了保持本文简单我把这一步留到测试项目时再做。

 

在PrepareAffiliateModel的model.Active = affiliate.Active下面添加以下代码

 

// 数据模型->创建/编辑 视图模型

model.AffiliateWebSite = affiliate.AffiliateWebSite;

 

在 public ActionResult Create(AffiliateModel model, bool continueEditing的affiliate.Active = model.Active下面添加以下代码


// 创建视图模型 -> 数据模型

affiliate.AffiliateWebSite = model.AffiliateWebSite;

 

public ActionResult Edit(AffiliateModel model, bool continueEditing)做类似的修改

 

// 编辑视图模型 -> 数据模型

affiliate.AffiliateWebSite = model.AffiliateWebSite;

 

数据库

 

如果你是在扩展已安装的程序(包括已创建的数据库),那么你必须手动添加对应的列("AffiliateWebSite")到相应的表("Affiliate")中。

 

故障排除

    • 重新创建数据库。用你自定义的SQL脚本或者nopCommerce 皆可。
    • 更新数据库结构时要暂停服务器。
    • 请把细节发布到我们的论坛以寻求帮助。
原文地址:https://www.cnblogs.com/yersans/p/4386241.html