玩轉ASP.NET 5:初始化資料庫

來源:互聯網
上載者:User

標籤:

1.初始化資料庫

  • 1.2目錄

        這不是專述模式/架構設計的文章,架構搭建以講解文章為目的,先不過多分層。

        

        截這個圖也是便於你對應下面找代碼檔案路徑!

  • 1.2代碼

        先控制台應用程式來示範。(比較蛋疼,MS針對ASP.NET 5測試架構在beta1版中,可用XUnit.KRunner。beta2中我也不知道用那個。)

        不管你用不用EF?傳統做法先設計資料庫,但寫代碼物件導向開發時還是要設計實體(模型),為了方便映射實體的屬性和資料庫欄位是一一對應(也可以通過Fluent API配置,實體屬性設計和欄位不對應)。實體可以當作業務對象,視圖模型,傳輸對象。但根據需要這些對象或模型屬性不一定和資料庫欄位一致,可以另外定義。

        我們先設計一個實體基類(還是那句話,僅供講解,代碼不全或不嚴謹,理解萬歲啦!): 

using System.ComponentModel.DataAnnotations;namespace BlogASPNET5.Entity.Bases{    /// <summary>    /// 實體基類    /// </summary>    /// <typeparam name="T">主鍵類型</typeparam>    public class EntityBase<T>    {        [Key]        public T Id { get; set; }        //記錄建立時間        //是否刪除        //行版本    }}

       註:EF對於主鍵類型為整型和Guid類型,其屬性為Id或類名+Id(不分大小寫),可以不用標註Key;整型自增,便於閱讀;Guid,便於資料合併;也可以字串。所以這裡用到泛型,繼承時再決定什麼類型。

       下面再定義Account相關的角色實體:

using BlogASPNET5.Entity.Bases;using System.Collections.Generic;namespace BlogASPNET5.Entity.Accounts{    /// <summary>    /// 角色實體    /// </summary>    public class Role :EntityBase<int>    {        public string Name { get; set; }        public string Description { get; set; }        /// <summary>        /// 導覽屬性  (後面示範Redis時,不要導覽屬性)        /// </summary>        public ICollection<User> Users { get; set; }    }    }

           Account相關的使用者實體:

using BlogASPNET5.Entity.Bases;namespace BlogASPNET5.Entity.Accounts{    public class User : EntityBase<int>    {        public string Name { get; set; }        public string Password { get; set; }        public Gender Gender { get; set; }        /// <summary>        /// 角色Id 外鍵         /// </summary>        public int RoleId { get; set; }        /// <summary>        /// 導覽屬性        /// </summary>        public Role Role { get; set; }    }    /// <summary>    /// 性別 枚舉類型    /// </summary>    public enum Gender { man, woman }}

         註:EF7又不支援複雜類型(其實通過繼承即可),但枚舉類型支援保留;後面使用Redis,導覽屬性就沒用了。

         既然要用EF來建立資料庫及初始化資料,需要EF操作上下文類:

using BlogASPNET5.Entity.Accounts;using Microsoft.Data.Entity;using Microsoft.Data.Entity.Metadata;namespace BlogASPNET5.Repository.Contexts{    public class EFContext :DbContext    {        public DbSet<Role> Roles { get; set; }        public DbSet<User> Users { get; set; }        protected override void OnConfiguring(DbContextOptions options)        {            options.UseSqlServer("Server=.;Database=TestDB;UID=sa;PWD=123456;");        }        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            //多對一關聯性及指定外鍵            modelBuilder.Entity<User>().ManyToOne(r => r.Role, u => u.Users).ForeignKey(f => f.RoleId);        }    }}

          定義初始化資料庫方法:

using BlogASPNET5.Entity.Accounts;using BlogASPNET5.Repository.Contexts;using System.Linq;namespace BlogASPNET5.Repository.Migrations{    public static class SampleData    {        static EFContext db = new EFContext();        public static void SetData()        {            db.Database.EnsureDeleted();            db.Database.EnsureCreated();            db.Add(                new Role { Name = "manage", Description = "管理員" },                new Role { Name = "member", Description = "會員" });            db.SaveChanges();            //嘛蛋,CoreCLR沒隨機函數,迴圈啦            for (int i = 1; i <= 1000; i++)            {                db.Add(                    new User                    {                        Name = "admin" + i,                        Password = "abc" + i,                        Gender = Gender.man,                        Role = db.Roles.Single(r => r.Name == "manage")                    });                db.SaveChanges();            }            for (int i = 1; i <= 1000; i++)            {                db.Add(                    new User                    {                        Name = "member" + i,                        Password = "efg" + i,                        Gender = Gender.woman,                        Role = db.Roles.Single(r => r.Name == "member")                    });                db.SaveChanges();            }        }    }}
  • 1.3調用

     在控制台程式調用:

using BlogASPNET5.Repository.Contexts;using BlogASPNET5.Repository.Migrations;using System;namespace BlogASPNET5.ConsoleApp{    public class Program    {        public void Main(string[] args)        {            //初始化資料,建立完了注釋掉                 SampleData.SetData();            Console.WriteLine("set data OK!");            Console.ReadLine();            using (var db = new EFContext())            {                var lists = db.Users;                foreach (var item in lists)                {                    Console.WriteLine(item.Name);                }            }            Console.ReadLine();        }    }}

        結果就不了。 EF7 beta2又一個改進:建立出來的表,不再有MigrationHistory(看著不爽)這個表了。

2.小結

        本篇先初始化資料庫,下一章資料操作封裝及查詢分頁。   

        打個“小廣告 ”!歡迎志同道合的園友,加入QQ群:290576772(加時註明部落格園)

 

       

玩轉ASP.NET 5:初始化資料庫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.