abp(net core)+easyui+efcore實現倉儲管理系統——ABP整體介紹(一)html
abp(net core)+easyui+efcore實現倉儲管理系統——解決方案介紹(二)數據庫
在上二篇文章中咱們簡單介紹了一下ABP.TPLMS系統的概況,已經對ABP的體系結構以及項目結構有了一個初步的瞭解。在這一篇文章中咱們主要和領域層打交道,主要是建立實體與進行遷移。接下來咱們開始建立Module實體。app
1、建立Module實體工具
實體是DDD(領域驅動設計)的核心概念之一。Eirc Evans是這樣描述的實體的:「它根本上不是經過屬性定義的,而是經過一系列連續性和標識定義的」。所以,實體都有Id屬性而且都存儲到數據庫中。一個實體通常會映射到數據庫的一張表。如今咱們來完成如下任務:在領域層建立一個Entitys文件夾,並在這個文件夾中建立Module實體類。
post
1. 在Visual Studio 2017的「解決方案資源管理器」中,右鍵單擊「ABP.TPLMS.Core」項目。 選擇「添加」 > 「新建文件夾」。以下圖。ui
2.將文件夾命名爲「Entitys」。this
3. 右鍵單擊「Entitys」文件夾,而後選擇「添加」 > 「類」。 將類命名爲 Module,而後選擇「添加」。以下圖。spa
4.ABP中全部的實體類都繼承自Entity,而Entity實現了IEntity接口;而IEntity接口是一個泛型接口,經過泛型指定主鍵Id類型,默認的Entity的主鍵類型是int類型。以下圖。設計
5.建立Module類,確定須要保存建立時間,能夠經過實現審計模塊中的IHasCreationTime來實現這種通用功能。以下圖。code
6. abp中實體是派生於Entity類,先看一下咱們在Core層新建的Module類。代碼以下:
using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using Abp.Timing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace ABP.TPLMS.Entitys { public class Module:Entity, IHasCreationTime { public const int MaxLength = 255; public Module() { this.DisplayName = string.Empty; this.Name = string.Empty; this.Url = string.Empty; this.HotKey = string.Empty; this.ParentId = 0; this.IconName = string.Empty; this.Status = 0; this.ParentName = string.Empty; this.RequiredPermissionName = string.Empty; this.RequiresAuthentication = false; this.SortNo = 0; CreationTime = Clock.Now; } [Required] [StringLength(MaxLength)] public string DisplayName { get; set; } [Required] [StringLength(MaxLength)] public string Name { get; set; } [Required] [StringLength(MaxLength)] public string Url { get; set; } [StringLength(MaxLength)] public string HotKey { get; set; } public int ParentId { get; set; } public bool RequiresAuthentication { get; set; } public bool IsAutoExpand { get; set; } [StringLength(MaxLength)] public string IconName { get; set; } public int Status { get; set; } [Required] [StringLength(MaxLength)] public string ParentName { get; set; } [StringLength(MaxLength)] public string RequiredPermissionName { get; set; } public int SortNo { get; set; } public DateTime CreationTime { get; set; } } }
在上面的Module實體類中的一些屬性上咱們定義了[Required]、[MaxLength]等特性用來進行輸入校驗的。
上面的Module實體類,沒有添加Id屬性,爲何呢?由於Module繼承自Entity類,Entity類已經定義Id,它是該Entity類的主鍵。所以,全部繼承Entity類的實體類的主鍵名都是Id。
Id(主鍵)的類型是能夠更改的,默認是int(int32)。若是你想將Id定義爲其餘類型,能夠在<>內寫,好比Guid,long也是能夠的。
Entity類重寫了等號運算符(==),能夠輕鬆地檢查兩個實體是否相同了(實體的Id相同則認爲它們相同)。它也定義了IsTransient方法來檢測它是否有Id。
IHasCreationTime接口使用一個通用的屬性來描述一個實體的「建立時間」。當實現了該接口的實體類插入到數據庫中時,ABP會自動地將當前的時間設置給CreationTime。
7.定義好實體以後,咱們就要去DbContext中定義實體對應的DbSet,以應用Code First 數據遷移。找到咱們的基礎服務層,即以EntityFrameworkCore結尾的項目中,找到DbContext類,以下圖,添加如下代碼。
using Microsoft.EntityFrameworkCore; using Abp.Zero.EntityFrameworkCore; using ABP.TPLMS.Authorization.Roles; using ABP.TPLMS.Authorization.Users; using ABP.TPLMS.MultiTenancy; using ABP.TPLMS.Entitys; namespace ABP.TPLMS.EntityFrameworkCore { public class TPLMSDbContext : AbpZeroDbContext<Tenant, Role, User, TPLMSDbContext> { /* Define a DbSet for each entity of the application */ public TPLMSDbContext(DbContextOptions<TPLMSDbContext> options) : base(options) { } public DbSet<Module> Modules { get; set; } } }
1.從菜單中選擇「工具->NuGet包管理器器—>程序包管理器控制檯」菜單。以下圖。
2. 在PMC中,默認項目選擇EntityframeworkCore對應的項目後。輸入如下命令:Add-Migration AddEntityModule,建立遷移。以下圖。
3. 在上面的命令執行完畢以後,建立成功後,會在Migrations文件夾下建立時間_AddEntityModule格式的類文件,這些代碼是基於DbContext指定的模型。以下圖。
4.在程序包管理器控制檯,輸入Update-Database,回車執行遷移。執行成功後,查看數據庫,Moudles表建立成功。以下圖。