內容
-
介紹
-
擴展的抽象實體
-
將新屬性添加給用戶
-
添加遷移
-
在界面上顯示地址
-
在用戶編輯/添加功能中添加地址
-
-
擴展的非抽象類實體
-
獲得版本的派生實體
-
添加遷移
-
在界面上添加價格
-
在創建/編輯版本功能中加入價格
-
-
源代碼
介紹
本教程是一步一步指南以了解如何添加新的屬性,對現有的實體,從數據庫層和 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\''
}
然后運行項目: