標籤:檔案 ring collect 程式包管理 asp.net serve protect 設計原則 database
概述
上一章,我們簡單的搭建了依賴注入的三層架構,但是,沒有真正的使用,而我們現在就使用MySQL資料,基於 EF Core 的 DbFirst 進行架構搭建。
- 微軟爸爸官方文檔:使用新資料庫在 ASP.NET Core 上開始使用 EF Core
- 資料庫表欄位命名規範
步驟
1. 右擊 Entity 項目,點擊“管理NuGet程式包”
2. 安裝以下三個包
- Microsoft.EntityFrameworkCore 安裝版本:2.1.0
- Microsoft.EntityFrameworkCore.Tools 安裝版本:2.1.0
- Pomelo.EntityFrameworkCore.MySql 安裝版本:2.1.0-rc1-final,注意,由於當前這個最新穩定版還是2.0.1,如果安裝了2.0.1,將會在資料庫遷移中失敗。因此應該在NuGet中勾選“包括預發行版”,安裝最新的 2.1.0-rc1-final
安裝完成後,如所示
3. 在 Entity -> DataTable 檔案夾下,添加 BaseEntity.cs ,注意,這裡的屬性值不按照平時的Pascal命名規則,而是採用資料庫命名設計原則去命名,相見參考連結二。
public abstract class BaseEntity { public BaseEntity() { create_time = DateTime.Now; } /// <summary> /// DB版號,Mysql詳情參考;http://www.cnblogs.com/shanyou/p/6241612.html /// </summary> //1537269869//Mysql不允許byte[]類型上標記TimeStamp/RowVersion,這裡使用DateTime類型配合標記ConcurrencyCheck達到並發控制 [ConcurrencyCheck] public DateTime row_version { get; set; } /// <summary> /// 建立時間 /// </summary> public DateTime create_time { get; set; } }BaseEntity
4. 在 Entity -> DataTable 檔案夾下,添加 DT_User.cs
public class DT_User : BaseEntity { public DT_User() { } [DataMember] [Key] public long user_id { get; set; } [Required] [MaxLength(50)] [Description("使用者名稱")] public string user_name { get; set; } [Required] [MaxLength(32)] [Description("密碼")] public string user_password { get; set; } }DT_User
5. 在 Entity -> MyContext.cs 檔案夾中,添加資料表
public class MyContext : DbContext { public MyContext() : base() { } public MyContext(DbContextOptions<MyContext> options) : base(options) { } override protected void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); } #region 資料表 public DbSet<DT_User> DT_User { get; set; } #endregion }MyContext
6. 在 Bll -> Interfaces 檔案夾下,添加介面 IDT_UserService.cs,可以注意到
public interface IDT_UserService : IBllService<DT_User> { /// <summary> /// 插入一個新對象 /// </summary> /// <returns></returns> DT_User Insert(); /// <summary> /// 擷取使用者資料表 /// </summary> /// <returns></returns> IEnumerable<DT_User> GetList(); }IDT_UserService
7. 在 Bll -> Implements 檔案夾下,添加類 DT_UserService.cs
public class DT_UserService : BllService<DT_User>, IDT_UserService { /// <summary> /// 用於執行個體化父級 /// </summary> /// <param name="rep"></param> public DT_UserService(IDalService<DT_User> dal) : base(dal) { } public IEnumerable<DT_User> GetList() { return GetEntities(r => true); } public DT_User Insert() { DT_User user = new DT_User { user_name = "test-" + new Random().Next(10000), user_password = DateTime.Now.ToString() }; return AddEntity(user, true); } }DT_UserService 8. 回到 Signup.cs 檔案中,添加資料庫注入依賴和業務類Service,以後每加一個業務類Service都必須在這裡加入一個 services.AddTransient()
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // 設定資料庫實體依賴注入 services.AddDbContext<MyContext>(options => options.UseMySql(Configuration.GetConnectionString("MySqlConnection"))); DIRegister(services); services.AddMvc(); } // 配置依賴注入映射關係 public void DIRegister(IServiceCollection services) { services.AddTransient(typeof(IDalService<>), typeof(DalService<>)); services.AddTransient(typeof(IDT_UserService), typeof(DT_UserService)); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); } }Startup
9. 在 appsettings.json 下,添加MySQL資料庫連接字串
{ "ConnectionStrings": { "MySqlConnection": "Server=localhost;database=loda_demo;uid=root;pwd=123456;" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } }}appsettings.json
10. 資料庫設計完成,可以進行遷移了,進入“程式包管理主控台”
11. 注意在預設項目中,切換到 Entity 項目,在輸入框輸入:add-migration init_1 ,注意,這裡的 init_1 只是當前遷移的名字,當下一次資料庫重新設計後,例如在DT_User中添加一個user_age屬性,需要重新遷移,那麼就需要輸入 add-migration init_2 ,必須跟之前的名字不一樣,名字隨意起,當提示 “To undo this action, use Remove-Migration.”時,代表遷移成功,可以看到項目下多了一些檔案。
12. 繼續輸入 update-database ,以下就是操作成功的提示,我們可以開啟MySQL資料庫查看是否已經更新成功了。
13. 最後,在 api 中進行測試,在 ValuesController.cs 中添加如下代碼
[Route("api/[controller]")] public class ValuesController : Controller { private IDT_UserService _userService; public ValuesController(IDT_UserService userService) { //依賴注入得到執行個體 _userService = userService; } public IActionResult Test() { _userService.Insert(); return Ok(_userService.GetList().ToList()); } }ValuesController
14. 運行程式,開啟頁面,得到結果,可以去資料庫查看,也已經寫入資料庫了
15. 最後附上架構檔案圖
OK,基於EF Core 的 MySQL資料庫遷移項目就到此結束了,如果有其他業務,可以依照上述DT_User,DT_UserService,IDT_UserService中擴充,有了類比的使用者資料,我們就要開始考慮如何進行使用者驗證了。下一章,我們將介紹使用 JWT 進行身分識別驗證。
基於 ASP.NET Core 2.0 WebAPI 後台架構搭建(2) - EF Core (MySQL) CodeFirst 資料庫遷移與依賴注入