新增實體
在類庫CORE中新增:
[Table("PbPhones")] public class Phone : CreationAuditedEntity<long> { public const int MaxNumberLength = 16; [ForeignKey("PersonId")] public virtual Person Person { get; set; } public virtual int PersonId { get; set; } [Required] public virtual PhoneType Type { get; set; } [Required] [MaxLength(MaxNumberLength)] public virtual string Number { get; set; } }
電話號碼存在表“PbPhones”中,他的主鍵是long自增,然後也帶稽核屬性的欄位。和person的關係為一對多。
新增phone實體導航屬性到person實體中。
[Table("PbPersons")] public class Person : FullAuditedEntity { //...other properties public virtual ICollection<Phone> Phones { get; set; } }
再新增一個列舉型別
/// <summary> /// 電話型別 /// </summary> public enum PhoneType : byte {/// <summary> /// 移動 /// </summary> Mobile, /// <summary> /// 住宅 /// </summary> Home, /// <summary> /// 商業 /// </summary> Business }
最後,在 DbContext中我們增加了一個 DbSet 屬性的Phone。
再將Phone實體,新增到Person實體中。
新增資料庫遷移
我們的模型實體已經發生變更,所以我們需要新增一個新的遷移類:
然後是遷移生成的PbPhones表
public partial class Add_Phones : DbMigration { public override void Up() { CreateTable( "dbo.PbPhone", c => new { Id = c.Long(nullable: false, identity: true), PersonId = c.Int(nullable: false), Type = c.Byte(nullable: false), Number = c.String(nullable: false, maxLength: 16), CreationTime = c.DateTime(nullable: false), CreatorUserId = c.Long(), Phone_Id = c.Long(), }) .PrimaryKey(t => t.Id) .ForeignKey("Basic.Person", t => t.PersonId, cascadeDelete: true) .ForeignKey("dbo.PbPhone", t => t.Phone_Id) .Index(t => t.PersonId) .Index(t => t.Phone_Id); } public override void Down() { DropForeignKey("dbo.PbPhone", "Phone_Id", "dbo.PbPhone"); DropForeignKey("dbo.PbPhone", "PersonId", "Basic.Person"); DropIndex("dbo.PbPhone", new[] { "Phone_Id" }); DropIndex("dbo.PbPhone", new[] { "PersonId" }); DropTable("dbo.PbPhone"); } }
初始化預設資料
在EntityFramewok中新增初始化資料
private void CreatePhone() { var defaultPhone = _context.Persons.FirstOrDefault(p => p.EmailAddress == "admin@yoyocms.com"); if (defaultPhone==null) { _context.Persons.Add(new Person() { Name = "張三", EmailAddress = "admin@yoyocms.com", Phones = new List<Phone>() { new Phone() {Type = PhoneType.Business,Number = "87115555"}, new Phone() {Type = PhoneType.Home,Number = "010-1109"} } }); } var defaultPerson = _context.Persons.FirstOrDefault(p => p.EmailAddress == "lisi@yoyocms.com"); if (defaultPerson==null) { _context.Persons.Add(new Person() { Name = "李四", EmailAddress = "lisi@yoyocms.com", Phones = new List<Phone>() { new Phone() {Type = PhoneType.Business,Number = "88452675"}, new Phone() {Type = PhoneType.Home,Number = "010-441109"} } }); } _context.SaveChanges(); }
這樣的話,就是張三下面有2機號碼。李四也有兩個聯絡號碼。
修改分頁查詢
首先修改PersonListDto,新增PhoneListDto
[AutoMapFrom(typeof (Phone))] public class PhoneListDto : CreationAuditedEntity<long> { /// <summary> /// 電話型別 /// </summary> public virtual PhoneType Type { get; set; } /// <summary> /// 聯絡號碼 /// </summary> public virtual string Number { get; set; } }
將此Dto新增到PersonListDto中
public class PersonListDto : EntityDto<int> { //額外的程式碼 public Collection<PhoneListDto> phones { get; set; } }
剩下的就是我們操作檢視頁面,將電話號碼顯示在頁面上了。
這裡我就去考慮頁面好不好看的問題了。這個不是本次教程的目的。
<tr> <th>電話型別</th> <th>電話號碼</th> </tr> @foreach (var phone in person.Phones) { <tr> <td>@phone.Type</td> <td>@phone.Number</td> </tr> } </tr>
將以上資訊新增到person檢視中,然後執行專案
到目前為止就是ABP最基本的用法了。
有什麼不清楚的話,可以加群討論