在ABPZERO中,擴展實體的方法。


內容

  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”字段:
image

便於測試,我們添加了一些用戶數據。

在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” 的值。

然后運行項目,然后打開用戶列表:
44

上面的例子是通過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>

然后運行項目:

image

此處我們沒有使用本地化文本,如果要啟用的話,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”看到的新字段:

image

然后我們可以看到現有的標准版的價格被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\''
}

然后運行項目:
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM