基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

时间:2022-05-17 17:12:59

  概述

  上一章,我们简单的搭建了依赖注入的三层架构,但是,没有真正的使用,而我们现在就使用MySQL数据,基于 EF Core 的 DbFirst 进行框架搭建。


 

  步骤

  1. 右击 Entity 项目,点击“管理NuGet程序包”

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

  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

  安装完成后,如下图所示

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

  3. 在 Entity -> DataTable 文件夹下,添加 BaseEntity.cs ,注意,这里的属性值不按照平时的Pascal命名规则,而是采用数据库命名设计原则去命名,相见参考链接二。

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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; }
    }
BaseEntity

 

  

  4. 在 Entity -> DataTable 文件夹下,添加 DT_User.cs

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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 文件夹中,添加数据表

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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,可以注意到

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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()
基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
    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数据库连接字符串

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
{
  "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. 数据库设计完成,可以进行迁移了,进入“程序包管理控制台”

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

  11. 注意在默认项目中,切换到 Entity 项目,在输入框输入:add-migration init_1 ,注意,这里的 init_1 只是当前迁移的名字,当下一次数据库重新设计后,例如在DT_User中添加一个user_age属性,需要重新迁移,那么就需要输入 add-migration init_2 ,必须跟之前的名字不一样,名字随意起,当提示 “To undo this action, use Remove-Migration.”时,代表迁移成功,可以看到项目下多了一些文件。

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

  

  12. 继续输入 update-database ,以下就是操作成功的提示,我们可以打开MySQL数据库查看是否已经更新成功了。

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

  13. 最后,在 api 中进行测试,在 ValuesController.cs 中添加如下代码

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入
[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. 运行程序,打开页面,得到结果,可以去数据库查看,也已经写入数据库了

基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

  

 

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 

  15. 最后附上框架文件图

  基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入

 


  OK,基于EF Core 的 MySQL数据库迁移项目就到此结束了,如果有其他业务,可以依照上述DT_User,DT_UserService,IDT_UserService中扩展,有了模拟的用户数据,我们就要开始考虑如何进行用户验证了。下一章,我们将介绍使用 JWT 进行身份验证。