内容

  1. 介绍

  2. 扩展的抽象实体

    1. 将新属性添加给用户

    2. 添加迁移

    3. 在界面上显示地址

    4. 在用户编辑/添加功能中添加地址

  3. 扩展的非抽象类实体

    1. 获得版本的派生实体

    2. 添加迁移

    3. 在界面上添加价格

    4. 在创建/编辑版本功能中加入价格

  4. 源代码


介绍

本教程是一步一步指南以了解如何添加新的属性,对现有的实体,从数据库层和 UI 层。

在 AspNet ZERO中的Tenant、User和Role的实体都算 抽象的,另一些则不。有一些差异。所以,我们分离它分成两个部分。

扩展抽象实体

我们用User实体作为例子。我们想要将address 属性添加到实体中。

将新属性添加到用户

打开 Authorization\Users\User.cs (在.CORE类库中) 并添加新的属性 ︰

public class User : AbpUser<Tenant, User>
{
//...existing code public virtual string Address { get; set; }
}

在这里,我们隐藏了其他代码仅仅为了显示简单的用户类。

然后您可以添加地址属性的属性。

添加迁移

由于我们添加新的属性,我们数据库架构已更改。不论我们改变我们的实体,我们应添加新的数据库迁移。打开控制台软件包管理器并编写新的迁移代码 ︰

Add-Migration "Added_Address_To_User"

得到一个迁移类:

public partial class Added_Address_To_User : DbMigration
{
public override void Up()
{
AddColumn("dbo.AbpUsers", "Address", c => c.String());
} public override void Down()
{
DropColumn("dbo.AbpUsers", "Address");
}
}

然后更新数据库:

Update-Database

然后打开数据库中的“AbpUsers”表,可以看到一个新的“Address”字段:

便于测试,我们添加了一些用户数据。

在UI界面上显示address字段

从Authorization\Users\UserAppService.cs (in .Application 类库中)

获取用户列表。

他的返回dto为“UserListDto ”。所以我们要修改他。

[AutoMapFrom(typeof(User))]
public class UserListDto : EntityDto<long>, IPassivable, IHasCreationTime
{
//...existing code public string Address { get; set; }
}

UserListDto 是通过automapper自动映射的,所以不需要修改UserAppService.GetUsers方法.

然后我们去ui层,路径Web\App\common\views\users\index.js 添加name属性为“address” 的值。

然后运行项目,然后打开用户列表:

上面的例子是通过SPA来演示的。如果要使用MPA,操作也是类似的,只要打开WEB项目中的Web\Areas\Mpa\Views\Users\index.js,添加字段就可以。

在添加和编辑页面上添加address

客户端使用 UserAppService.GetUserForEdit方法来编辑窗体上显示用户信息。它返回GetUserForEditOutput对象,其中包含一个UserEditDto对象,包括用户属性。所以,我们应该将地址添加到 UserEditDto,以允许客户端上创建更新地址属性更改 ︰

public class UserEditDto : IValidate, IPassivable
{
//...existing code public string Address { get; set; }
}

然后打开路径"Web\App\common\views\users\createOrEditModal.cshtml"

添加以下代码

<div class="form-group form-md-line-input form-md-floating-label no-hint">
<input type="text" name="Address" class="form-control" ng-class="{'edited':vm.user.address}" ng-model="vm.user.address">
<label>@L("Address")</label>
</div>

然后运行项目:

此处我们没有使用本地化文本,如果要启用的话,Core类库中\Localization\ExtendEntitiesDemo中的XML文件打开。

拓展非抽象实体

我们拿Edition实体作为示例

获得Edition的派生实体

由于 Edition不是抽象对象,我们无法给他添加新属性。但是我们可以使用OOP模式中的

继承和组合(inheritance or composition)。

我们使用简单的继承,创建一个新类MyEdition继承Edition。

public class MyEdition : Edition
{
public virtual int Price { get; set; }
}

添加迁移

添加迁移

由于我们添加一个新的实体类,我们数据库架构已更改。不论我们改变我们的实体,我们应添加新的数据库迁移。打开控制台软件包管理器并编写新的迁移代码 ︰

Add-Migration "Added_MyEdition_Entity"

这将创建一个新的实体框架迁移类,如下所示 ︰

public partial class Added_MyEdition_Entity : DbMigration
{
public override void Up()
{
AlterTableAnnotations(
"dbo.AbpEditions",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 32),
DisplayName = c.String(nullable: false, maxLength: 64),
IsDeleted = c.Boolean(nullable: false),
DeleterUserId = c.Long(),
DeletionTime = c.DateTime(),
LastModificationTime = c.DateTime(),
LastModifierUserId = c.Long(),
CreationTime = c.DateTime(nullable: false),
CreatorUserId = c.Long(),
Price = c.Int(),
Discriminator = c.String(nullable: false, maxLength: 128),
},
annotations: new Dictionary<string, AnnotationValues>
{
{
"DynamicFilter_MyEdition_SoftDelete",
new AnnotationValues(oldValue: null, newValue: "EntityFramework.DynamicFilters.DynamicFilterDefinition")
},
}); AddColumn("dbo.AbpEditions", "Price", c => c.Int(nullable: false, defaultValue: 0));
AddColumn("dbo.AbpEditions", "Discriminator", c => c.String(nullable: false, maxLength: 128, defaultValue: "MyEdition"));
} public override void Down()
{
//...other code
}
}

实际上,AbpEditions 迁移中,添加两个新字段:

  • Price: 这个是我们添加到MyEdition中的价格字段
  • Discriminator: EF实体框架来区别Edition和MyEdition的区别(自动创建的继承)

在更新数据库之前,我们需要改下默认的迁移代码:

AddColumn("dbo.AbpEditions", "Price", c => c.Int());
AddColumn("dbo.AbpEditions", "Discriminator", c => c.String(nullable: false, maxLength: 128));

修改为:

AddColumn("dbo.AbpEditions", "Price", c => c.Int(nullable: false, defaultValue: 0));
AddColumn("dbo.AbpEditions", "Discriminator", c => c.String(nullable: false, maxLength: 128, defaultValue: "MyEdition"));

这样做的目的是为了让MyEdition替换为现有的Edition实体。

Update-Database

打开表“AbpEditions”看到的新字段:

然后我们可以看到现有的标准版的价格被MyEdition修改为0。

有关迁移的最后一件事情就是 Seed Code 中。我们需要进行修改EntityFramework\Migrations\Seed\DefaultEditionCreator.cs:

defaultEdition = new Edition { Name = EditionManager.DefaultEditionName, DisplayName = EditionManager.DefaultEditionName };

修改为

defaultEdition = new MyEdition { Name = EditionManager.DefaultEditionName, DisplayName = EditionManager.DefaultEditionName };

因此,我们创建新数据库的时候,会创建MyEdition实体。

在UI界面上显示价格

从application类库中打开Editions\EditionAppService.cs ,调用getlist方法。

返回值是:EditionListDto (ABPZERO只会用DTO进行客户端之间的通信)。

所以我们的需要把价格属性添加到“EditionListDto”中:

[AutoMapFrom(typeof(Edition), typeof(MyEdition))]
public class EditionListDto : EntityDto, IHasCreationTime
{
//...existing code public int Price { get; set; }
}

然后就是automapper自动映射,不用进行处理。

然后打开WEB类库中的“Web\App\host\views\editions\index.js”,添加name属性为“Price”:

{
name: app.localize('EditionName'),
field: 'displayName'
},
{
name: app.localize('Price'),
field: 'price'
},
{
name: app.localize('CreationTime'),
field: 'creationTime',
cellFilter: 'momentFormat: \'L\''
}

然后运行项目:

在ABPZERO中,扩展实体的方法。的更多相关文章

  1. ADO.NET EF 中的实体修改方法

    http://www.cnblogs.com/zfz15011/archive/2010/05/30/1747486.html 1.传统修改模式,看下列代码 using (NorthwindEntit ...

  2. .NET MVC3中扩展一个HtmlHelper方法CheckBoxList

    MVC中有DropDownList方法,挺好用,可是最常用的需求,一组checkboxlist咋没个类似方法呢?郁闷之余,自己做一个吧,直接上代码 public static MvcHtmlStrin ...

  3. .NET中微软实体框架的数据访问方法

    介绍 本文的目的是解释微软的实体框架提供的三种数据访问方法.网上有好几篇关于这个话题的好文章,但是我想以一个教程的形式更详细地介绍这个话题,这个教程对于开始学习实体框架及其方法的人来说是个入门.我们将 ...

  4. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

  5. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

  6. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  7. C#中扩展方法的使用

    MSDN中这样定义扩展方法:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. ...

  8. 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决

    问题描述: 在某个窗口下的编码中使用了以下扩展方法FindControl,以求根据字符串的值去操作控件(本文中的控件为Label控件)的属性. public static Control FindCo ...

  9. Ajax前台返回JSON数据后再Controller中直接转换成类型使用,后台接收json转成实体的方法

    之前写过一篇记录文章,写的是将一个比较复杂的数据结构在前台组合起来后传递到后台. 当时并不太了解@RequestBody,也并没有使用js提供的JSON.stringify()方法 所有都是自己写的, ...

随机推荐

  1. 利用Java泛型实现简单的泛型方法

    问题:编写一个泛型方法add(),当传入不同数字类型的值时,能够进行加法运算,(如可以传入int.long.float.double类型,但要对传入的值做一定的限定,如必须是数字). 解决:利用泛型编 ...

  2. unity A*寻路 (二)读取NavMesh数据

    上一章节我们已经看了怎么获得NavMesh数据保存为obj 这一章节我们来读取NavMesh数据 首先我们要定义两个结构体 点 和 三角形 为什么不用unity自带的Vector3呢? 相信你们应该已 ...

  3. IPFS: BitSwap协议(数据块交换)

    原创 2018-01-11 飞向未来 IPFS指南 BitSwap协议 IPFS节点之间是如何进行数据交换的?本文来讲一下这个问题. IPFS在BitTorrent的基础上实现了p2p数据交换协议:B ...

  4. 手机端原生js实现下拉刷新数据

    HTML结构如下: <div class="outerScroller comment"> <div class='scroll comment'> < ...

  5. TypeScript入门(一)

    TypeScript是微软官方的一种语言,是JavaScript的超集.它遵循的ECMA Script 6.0是下一代的JavaScript.浏览器还没有完全支持ES6,而ES5是弱类型的语言,还没有 ...

  6. 如何使用svn命令行更新想要的目录?

    内容来自网络. 一 某些原因想在svn co的时候排除某些目录,可以绕个圈子,分三步来完成:co外层目录:svn checkout --depth empty URL[URL[LOCATION]完成之 ...

  7. 笔记:XML-解析文档-DOM

    要处理XML文档,就要先解析(parse)他,解析器时这样一个程序,读入一个文件,确认整个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素,Java库提供了两种XML解析器: 像 ...

  8. 设计模式 --> (3)策略模式

    策略模式 策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异. ...

  9. c# 基于FTP协议的简易软件自动升级程序

    最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...

  10. 关闭系统邮件提醒:you hava a new mail(转)

    有时候,在输入某些触及到系统安全或者内核方面的命令都会提醒你: You have new mail in /var/spool/mail/root 只需要在root 用户下,不设置邮件检测即可! #e ...