.NET之生成数据库全流程
开篇语
本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程。采用EFCore作为ORM框架。
本次示例环境:vs2019、net5、mysql
创建项目
本次事例代码是用过vs2019创建的ASP.NET Core Web API项目
可以通过可视化界面创建或者通过命令行创建
dotnet new webapi -o Net5ByDocker
创建实体类
安装连接MySQL数据库组件
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0" /><PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Json.Newtonsoft" Version="5.0.0" />
增加实体类
[Table("user")]public class User{public User(){Id = Guid.NewGuid().ToString();}public User(string account, string password, string creater) : this(){Account = account;Password = password;Deleted = false;SetCreater(creater);}[Key][Comment("主键")][StringLength(36)][Required]public string Id { get; private set; }[Comment("帐号")][StringLength(36)][Required]public string Account { get; private set; }[Comment("密码")][StringLength(36)][Required]public string Password { get; private set; }[Comment("余额")][Column(TypeName = "decimal(18, 2)")][Required]public decimal Money { get; set; }[Comment("是否删除")][Column(TypeName = "tinyint(1)")][Required]public bool Deleted { get; private set; }[Comment("创建人")][StringLength(20)][Required]public string Creater { get; private set; }[Comment("创建时间")][Required]public DateTime CreateTime { get; private set; }[Comment("修改人")][StringLength(20)][Required]public string Modifyer { get; private set; }[Comment("修改时间")][Required]public DateTime ModifyTime { get; private set; }public void SetCreater(string name){Creater = name;CreateTime = DateTime.Now;SetModifyer(name);}public void SetModifyer(string name){Modifyer = name;ModifyTime = DateTime.Now;}}
这种只是增加实体类类型的一种方式,可能这种看着比较乱,还可以通过OnModelCreating实现,详情看参考文档
增加数据库上下文OpenDbContext
public class OpenDbContext : DbContext{public OpenDbContext(DbContextOptions<OpenDbContext> options): base(options){}public DbSet<User> Users { get; set; }}
Startup注入连接数据库操作
var connection = Configuration["DbConfig:Mysql:ConnectionString"];var migrationsAssembly = IntrospectionExtensions.GetTypeInfo(typeof(Startup)).Assembly.GetName().Name;services.AddDbContext<OpenDbContext>(option => option.UseMySql(connection, ServerVersion.AutoDetect(connection), x =>{x.UseNewtonsoftJson();x.MigrationsAssembly(migrationsAssembly);}));
生成迁移文件
引用组件
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.5">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.5">
迁移命令
add-migration Init
结果
要看下生成的迁移文件是否是自己预期的那样子,也可以在这一步就生成数据库,命令:Update-Database
数据种子
增加OpenDbSend类,添加数据种子
public class OpenDbSend{/// <summary>/// 生成数据库以及数据种子/// </summary>/// <param name="dbContext">数据库上下文</param>/// <param name="loggerFactory">日志</param>/// <param name="retry">重试次数</param>/// <returns></returns>public static async Task SeedAsync(OpenDbContext dbContext,ILoggerFactory loggerFactory,int? retry = 0){int retryForAvailability = retry.Value;try{dbContext.Database.Migrate();//如果当前数据库不存在按照当前 model 创建,如果存在则将数据库调整到和当前 model 匹配await InitializeAsync(dbContext).ConfigureAwait(false);//if (dbContext.Database.EnsureCreated())//如果当前数据库不存在按照当前 model创建,如果存在则不管了。// await InitializeAsync(dbContext).ConfigureAwait(false);}catch (Exception ex){if (retryForAvailability < 3){retryForAvailability++;var log = loggerFactory.CreateLogger<OpenDbSend>();log.LogError(ex.Message);await SeedAsync(dbContext, loggerFactory, retryForAvailability).ConfigureAwait(false);}}}/// <summary>/// 初始化数据/// </summary>/// <param name="context"></param>/// <returns></returns>public static async Task InitializeAsync(OpenDbContext context){if (!context.Set<User>().Any()){await context.Set<User>().AddAsync(new User("azrng", "123456", "azrng")).ConfigureAwait(false);await context.Set<User>().AddAsync(new User("张三", "123456", "azrng")).ConfigureAwait(false);}await context.SaveChangesAsync().ConfigureAwait(false);}}
设置项目启动时候调用
public static async Task Main(string[] args){var host = CreateHostBuilder(args).Build();using (var scope = host.Services.CreateScope()){var services = scope.ServiceProvider;var loggerFactory = services.GetRequiredService<ILoggerFactory>();var _logger = loggerFactory.CreateLogger<Program>();try{var openContext = services.GetRequiredService<OpenDbContext>();await OpenDbSend.SeedAsync(openContext, loggerFactory).ConfigureAwait(false);}catch (Exception ex){_logger.LogError(ex, $"项目启动出错 {ex.Message}");}}await host.RunAsync().ConfigureAwait(false);}
生成数据库
启动项目,自动生成数据库
表结构如下
如果后期数据库字段或者结构有变动,可以再次生成迁移文件然后生成数据库
查询数据
/// <summary>/// 用户接口/// </summary>public interface IUserService{string GetName();/// <summary>/// 查询用户信息/// </summary>/// <param name="account"></param>/// <returns></returns>Task<User> GetDetailsAsync(string account);}/// <summary>/// 用户实现/// </summary>public class UserService : IUserService{private readonly OpenDbContext _dbContext;public UserService(OpenDbContext dbContext){_dbContext = dbContext;}public string GetName(){return "AZRNG";}///<inheritdoc cref="IUserService.GetDetailsAsync(string)"/>public async Task<User> GetDetailsAsync(string account){return await _dbContext.Set<User>().FirstOrDefaultAsync(t => t.Account == account).ConfigureAwait(false);}}
一般更推荐建立指定的返回Model类,然后只查询需要的内容,不直接返回实体类
控制器方法
/// <summary>/// 查询用户详情/// </summary>/// <param name="account"></param>/// <returns></returns>[HttpGet]public async Task<ActionResult<User>> GetDetailsAsync(string account){return await _userService.GetDetailsAsync(account).ConfigureAwait(false);}
查询结果
{"id": "e8976d0a-6ee9-4e2e-b8d8-1fe6e85b727b","account": "azrng","password": "123456","money": 0,"deleted": false,"creater": "azrng","createTime": "2021-05-09T15:48:45.730302","modifyer": "azrng","modifyTime": "2021-05-09T15:48:45.730425"
}
参考文档
实体类型:https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=data-annotations
实体属性:https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwithout-nrt
.NET之生成数据库全流程相关推荐
- EF使用CodeFirst方式生成数据库技巧经验
前言 EF已经发布很久了,也有越来越多的人在使用EF.如果你已经能够非常熟练的使用EF的功能,那么就不需要看了.本文意在将自己使用EF的方式记录下来备忘,也是为了给刚刚入门的同学一些指导.看完此文,你 ...
- 利用yolov8零售商品识别实现的智能结算系统 yolo+后端flask+数据库sqlite+前端html(从零开始,全流程教学)
文章目录 1. 数据集的制作 1.1 使用爬虫采集数据集 1.2 使用labelme对图片进行标注 2. YOLOv8 2.1YOLO算法简单介绍 2.2 YOLOv8获取与调试 2.2.1 通过pi ...
- R语言使用knitr生成机器学习模型全流程步骤示例:knitr与自动化结果报告、knitr常用参数
R语言使用knitr生成机器学习模型全流程步骤示例:knitr与自动化结果报告.knitr常用参数 目录
- 达梦数据库全量数据恢复还原流程
达梦数据库全量数据恢复还原流程 1.环境描述 2.备份数据准备 3.流程 1.环境描述 服务器系统:CentOS Linux 7.6 达梦数据库:DM V8.1 远程工具:CRT 2.备份数据准备 还 ...
- cesium 加载bim模型_构建统一CIM数字底盘,实现基于BIM的全流程管控
▲点击关注,收获更多GIS精彩 2009年,SuperMap发布了首款二三维一体化GIS软件,首次提出了二三维一体化GIS技术.随后,二三维一体化的应用系统不断涌现,二三维一体化技术逐步成为三维GIS ...
- 高度可定制可用于商用目的全流程供应链系统(全部源码)
一.开源项目简介 高度可定制零售供应链中台基础系统,集成零售管理, 电子商务, 供应链管理, 财务管理, 车队管理, 仓库管理, 人员管理, 产品管理, 订单管理, 会员管理, 连锁店管理, 加盟管理 ...
- java pdf 修改内容_生成PDF全攻略之在已有PDF上添加内容的实现方法
项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...
- 一个实战案例带你走完python数据分析全流程:豆瓣电影评论的关键词云图制作
用python做数据处理流程大致可以分成以下三个部分: 一.数据的获取:一般可以有公开的数据集.网络爬虫.自己整理等方式. 二.数据的处理:包括数据的预处理.数据的查找/筛选/排序/统计等操作. 三. ...
- 【SSH框架/国际物流商综平台】-01-分三期(仓储管理,货运全流程管理,决策分析)- 项目背景 界面原型 用例图 企业组织结构 功能模块图 系统框架 项目表单收集
项目背景 商务综合管理平台是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发& ...
最新文章
- 题目1192:回文字符串
- 无线宝服务器连接不上,无线网络连接不上怎么办 为什么无线网络连接不上
- Datatable表格点击某个单元格可以获取整行数据
- android doc例程---Notepad Tutorial学习要点!
- LaTeX调整目录的行距
- 什么是防抖和节流?有什么区别?如何实现?
- react 设置背景图片 (等比例显示,不拉伸)
- 拓端tecdat|excel数据分析——贝叶斯分析预测
- 如何在 Azure 虚拟机里配置条带化
- delphi 10.4来了
- python123课后作业嵩天_MOOC嵩天《Python语言程序设计》Python123课后作业4
- 知识付费系统源码基于PHP开源的网站内容付费源码|知识付费小程序源码
- C程序 --- 判断闰年平年以及二月天数
- 影子卫士和影子系统哪个好用_大小仅3M的影子系统,绿软爱好者必装软件
- eNSP路由器连接外网
- Python+Excel:批量重命名多个工作簿
- 沉降观测曲线图 沉降观测汇总_沉降观测曲线图都有哪些
- wps文档漫游删除_WPS自带的文档漫游和在线模板怎么关闭?
- springboot毕设项目基于springboot的模拟面试平台 7tch0(java+VUE+Mybatis+Maven+Mysql)
- 计算机卡牌培养游戏,浅谈冒险游戏、卡牌游戏、养成游戏的几个设计要点
热门文章
- linux raw限制端口访出,使用Linux raw socket时需要注意的一些问题
- Oracle树形结构查询之prior的理解
- input file实现批量上传
- win32 注册表操作
- WindowsPhone8可缩放图片控件的实现
- Java实现文件过滤
- 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入...
- 关于使用 jquery Validate 使用出现的问题
- jdk 1结尾和2结尾_“与巢一起工作”的结尾对您意味着什么
- java 简单json和对象相互转换