建立一個Phone實體,完成多頁面的電話簿專案

角落的白板報發表於2016-08-18

新增實體

在類庫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實體中。

新增資料庫遷移

我們的模型實體已經發生變更,所以我們需要新增一個新的遷移類:

image

然後是遷移生成的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檢視中,然後執行專案

image

到目前為止就是ABP最基本的用法了。

有什麼不清楚的話,可以加群討論

-返回目錄-  ABP打造一個《電話簿專案》

交流QQ群:104390185

相關文章