概述
上一章,我们简单的搭建了依赖注入的三层架构,但是,没有真正的使用,而我们现在就使用MySQL数据,基于 EF Core 的 DbFirst 进行框架搭建。
步骤
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> //[Timestamp]//Mysql不允许byte[]类型上标记TimeStamp/RowVersion,这里使用DateTime类型配合标记ConcurrencyCheck达到并发控制 [ConcurrencyCheck] public DateTime row_version { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime create_time { get; set; } }
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; } }
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 }
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(); }
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); } }
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(); } }
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" } } } }
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()); } }
14. 运行程序,打开页面,得到结果,可以去数据库查看,也已经写入数据库了
15. 最后附上框架文件图
OK,基于EF Core 的 MySQL数据库迁移项目就到此结束了,如果有其他业务,可以依照上述DT_User,DT_UserService,IDT_UserService中扩展,有了模拟的用户数据,我们就要开始考虑如何进行用户验证了。下一章,我们将介绍使用 JWT 进行身份验证。