標籤:
1.初始化資料庫
這不是專述模式/架構設計的文章,架構搭建以講解文章為目的,先不過多分層。
截這個圖也是便於你對應下面找代碼檔案路徑!
先控制台應用程式來示範。(比較蛋疼,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(); } } }}
在控制台程式調用:
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:初始化資料庫