.NET之生成数据库全流程
发布于 2021-05-13 21:37 ,所属分类:数据库和大数据技术学习资料
开篇语
本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程。采用EFCore作为ORM框架。
本次示例环境:vs2019、net5、mysql
创建项目
本次事例代码是用过vs2019创建的ASP.NET Core Web API项目
可以通过可视化界面创建或者通过命令行创建
dotnetnewwebapi-oNet5ByDocker
创建实体类
安装连接MySQL数据库组件
<PackageReferenceInclude="Pomelo.EntityFrameworkCore.MySql"Version="5.0.0"/>
<PackageReferenceInclude="Pomelo.EntityFrameworkCore.MySql.Json.Newtonsoft"Version="5.0.0"/>
增加实体类
[Table("user")]
publicclassUser
{
publicUser()
{
Id=Guid.NewGuid().ToString();
}
publicUser(stringaccount,stringpassword,stringcreater):this()
{
Account=account;
Password=password;
Deleted=false;
SetCreater(creater);
}
[Key]
[Comment("主键")]
[StringLength(36)]
[Required]
publicstringId{get;privateset;}
[Comment("帐号")]
[StringLength(36)]
[Required]
publicstringAccount{get;privateset;}
[Comment("密码")]
[StringLength(36)]
[Required]
publicstringPassword{get;privateset;}
[Comment("余额")]
[Column(TypeName="decimal(18,2)")]
[Required]
publicdecimalMoney{get;set;}
[Comment("是否删除")]
[Column(TypeName="tinyint(1)")]
[Required]
publicboolDeleted{get;privateset;}
[Comment("创建人")]
[StringLength(20)]
[Required]
publicstringCreater{get;privateset;}
[Comment("创建时间")]
[Required]
publicDateTimeCreateTime{get;privateset;}
[Comment("修改人")]
[StringLength(20)]
[Required]
publicstringModifyer{get;privateset;}
[Comment("修改时间")]
[Required]
publicDateTimeModifyTime{get;privateset;}
publicvoidSetCreater(stringname)
{
Creater=name;
CreateTime=DateTime.Now;
SetModifyer(name);
}
publicvoidSetModifyer(stringname)
{
Modifyer=name;
ModifyTime=DateTime.Now;
}
}
这种只是增加实体类类型的一种方式,可能这种看着比较乱,还可以通过OnModelCreating实现,详情看参考文档
增加数据库上下文OpenDbContext
publicclassOpenDbContext:DbContext
{
publicOpenDbContext(DbContextOptions<OpenDbContext>options)
:base(options)
{
}
publicDbSet<User>Users{get;set;}
}
Startup注入连接数据库操作
varconnection=Configuration["DbConfig:Mysql:ConnectionString"];
varmigrationsAssembly=IntrospectionExtensions.GetTypeInfo(typeof(Startup)).Assembly.GetName().Name;
services.AddDbContext<OpenDbContext>(option=>option.UseMySql(connection,ServerVersion.AutoDetect(connection),x=>
{
x.UseNewtonsoftJson();
x.MigrationsAssembly(migrationsAssembly);
}));
生成迁移文件
引用组件
<PackageReferenceInclude="Microsoft.EntityFrameworkCore.Design"Version="5.0.5">
<PackageReferenceInclude="Microsoft.EntityFrameworkCore.Tools"Version="5.0.5">
迁移命令
add-migrationInit
结果

要看下生成的迁移文件是否是自己预期的那样子,也可以在这一步就生成数据库,命令:Update-Database
数据种子
增加OpenDbSend类,添加数据种子
publicclassOpenDbSend
{
///<summary>
///生成数据库以及数据种子
///</summary>
///<paramname="dbContext">数据库上下文</param>
///<paramname="loggerFactory">日志</param>
///<paramname="retry">重试次数</param>
///<returns></returns>
publicstaticasyncTaskSeedAsync(OpenDbContextdbContext,
ILoggerFactoryloggerFactory,
int?retry=0)
{
intretryForAvailability=retry.Value;
try
{
dbContext.Database.Migrate();//如果当前数据库不存在按照当前model创建,如果存在则将数据库调整到和当前model匹配
awaitInitializeAsync(dbContext).ConfigureAwait(false);
//if(dbContext.Database.EnsureCreated())//如果当前数据库不存在按照当前 model创建,如果存在则不管了。
//awaitInitializeAsync(dbContext).ConfigureAwait(false);
}
catch(Exceptionex)
{
if(retryForAvailability<3)
{
retryForAvailability++;
varlog=loggerFactory.CreateLogger<OpenDbSend>();
log.LogError(ex.Message);
awaitSeedAsync(dbContext,loggerFactory,retryForAvailability).ConfigureAwait(false);
}
}
}
///<summary>
///初始化数据
///</summary>
///<paramname="context"></param>
///<returns></returns>
publicstaticasyncTaskInitializeAsync(OpenDbContextcontext)
{
if(!context.Set<User>().Any())
{
awaitcontext.Set<User>().AddAsync(newUser("azrng","123456","azrng")).ConfigureAwait(false);
awaitcontext.Set<User>().AddAsync(newUser("张三","123456","azrng")).ConfigureAwait(false);
}
awaitcontext.SaveChangesAsync().ConfigureAwait(false);
}
}
设置项目启动时候调用
publicstaticasyncTaskMain(string[]args)
{
varhost=CreateHostBuilder(args).Build();
using(varscope=host.Services.CreateScope())
{
varservices=scope.ServiceProvider;
varloggerFactory=services.GetRequiredService<ILoggerFactory>();
var_logger=loggerFactory.CreateLogger<Program>();
try
{
varopenContext=services.GetRequiredService<OpenDbContext>();
awaitOpenDbSend.SeedAsync(openContext,loggerFactory).ConfigureAwait(false);
}
catch(Exceptionex)
{
_logger.LogError(ex,$"项目启动出错{ex.Message}");
}
}
awaithost.RunAsync().ConfigureAwait(false);
}
生成数据库
启动项目,自动生成数据库

表结构如下

如果后期数据库字段或者结构有变动,可以再次生成迁移文件然后生成数据库
查询数据
///<summary>
///用户接口
///</summary>
publicinterfaceIUserService
{
stringGetName();
///<summary>
///查询用户信息
///</summary>
///<paramname="account"></param>
///<returns></returns>
Task<User>GetDetailsAsync(stringaccount);
}
///<summary>
///用户实现
///</summary>
publicclassUserService:IUserService
{
privatereadonlyOpenDbContext_dbContext;
publicUserService(OpenDbContextdbContext)
{
_dbContext=dbContext;
}
publicstringGetName()
{
return"AZRNG";
}
///<inheritdoccref="IUserService.GetDetailsAsync(string)"/>
publicasyncTask<User>GetDetailsAsync(stringaccount)
{
returnawait_dbContext.Set<User>().FirstOrDefaultAsync(t=>t.Account==account).ConfigureAwait(false);
}
}
一般更推荐建立指定的返回Model类,然后只查询需要的内容,不直接返回实体类
控制器方法
///<summary>
///查询用户详情
///</summary>
///<paramname="account"></param>
///<returns></returns>
[HttpGet]
publicasyncTask<ActionResult<User>>GetDetailsAsync(stringaccount)
{
returnawait_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




![[Redis] 兄弟连NoSQL数据库之 Redis数据库管理与基础课程 Redis数据库零基础入门学习课程](https://static.kouhao8.com/sucaidashi/xkbb/4698e8e1f7e79d89635f19afb771ad37.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)

![数据库] 数据库视频 尚观云计算之mysql 基础概念视频 配置和使用视频教程](https://static.kouhao8.com/sucaidashi/xkbb/ae8cc037709dacd74467b64b8f25a355.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[数据库] ORACLE认证培训教程 9i DBA数据库管理员 Fundamentals I (76讲全)](https://static.kouhao8.com/sucaidashi/xkbb/9169a23c31bb9c6ff3576f75c4dcc06d.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[网站优化] 兄弟连NoSQL数据库之 Redis数据库管理与基础课程 Redis数据库零基础入门学习课程](https://static.kouhao8.com/sucaidashi/xkbb/6f716366eb922b26fc3aa7ffa1466b5d.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)

![[Access] 新东方IT培训之数据库(Access)(价值200)](https://static.kouhao8.com/sucaidashi/xkbb/6365a7ce314268d4485dd8c034f51d63.png?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)


![[数据库] MySQL数据库 DBA系列 全套培训视频 30章 超级经典 (送完整课程实验)](https://static.kouhao8.com/sucaidashi/xkbb/74c6656eb86170babccf92a253b272e6.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)



![[数据库] 分布式文档型数据库引擎开发视频课程(15集)](https://static.kouhao8.com/sucaidashi/xkbb/88600cb84361abcb074f492d9e2d5cf3.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[数据库] [中文]ORACLE 11g PL SQL数据库 基础入门视频教程完整版(27集全) 小布老师 播布客出品](https://static.kouhao8.com/sucaidashi/xkbb/c87afc62e0d03d43a8d9e1649171090e.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[数据库] xx学院 PHP从入门到精通视频教程53集 入门篇 数据库全解 King主讲 视频教程下载分享](https://static.kouhao8.com/sucaidashi/xkbb/a3c7e3d501e9c209d267c2fe4b9edfdc.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)

![[数据库] 80G 炼数成金 培训视频集 Openstack+数据库+PYTHON+大数据](https://static.kouhao8.com/sucaidashi/xkbb/225c820a77c4cd186e28f5c3efd35e26.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)






![[数据库] 刘道成MySql数据库视频教程 自学视频下载系列教程41集 增删改查企业数据库操作](https://static.kouhao8.com/sucaidashi/xkbb/5daaa414b7144104c35c7c52d3da6cbf.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[数据库] 上海交大_数据库系统及应用 27集_视频教程](https://static.kouhao8.com/sucaidashi/xkbb/5e06c561ff4cdfe480ac7c3203f5060b.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
相关资源