添加mysql数据存储 - (第五讲)
视频讲解如下:
工程源码下载:GPS定位系统系列教程源码下载
和《C#环境下使用EF操作MySql》章节一样,需要新建一个DbEntity工程。
注意:当前项目的具体表结构请以工程源码为主。
1、添加DbEntity工程
DbEntity工程需要安装的第三方库如下:
MySql.EntityFrameworkCore
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Relational
注意:千万不能安装preview版本,不然数据库初始化的时候会报下面这个错误:
Method not found: 'System.String Microsoft.EntityFrameworkCore.Diagnostics.RelationalStrings.get_NoConnectionOrConnectionString()'.
博主这里安装是是6.0.9版本

添加流程如下:
首先新建EF CORE类库项目:DbEntity

选择类库,项目名称为“DbEntity”,框架为.NET 6.0

工程新建好了之后,先添加我们需要的依赖到当前工程中:
MySql.EntityFrameworkCore
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Relational
最后添加我们的数据库报表文件,具体添加方法和《C#环境下使用EF操作MySql》章节一样的。我这里就不详细说明了。
最终目录结构如下:

DbBase.cs:公共类,包括字段的添加时间、删除时间、修改时间等
GpsData.cs:GPS的坐标信息保存在这里
User.cs:我们的用户注册信息
MyDbContext.cs:EF Core初始化文件
DbEntity工程添加完成之后,我们需要在WebApplicationGPS工程中引用DbEntity:依赖项->右键->添加项目引用->选择“DbEntity”

2、初始化数据库
数据库工程添加成功,接下来就是调用DbEntity工程,并初始化数据库表。
添加Res.cs公共类集合封装,在Res中引用我们的DbEntity库,Res.cs文件如下,后续我们还会在这里面添加其他东西
using DbEntity;
namespace WebApplicationGPS
{
public static class Res
{
/// <summary>
/// 数据库
/// </summary>
public static MyDbContext MyDb { set; get; }
}
}
往appsettings.json文件中添加我们的数据库链接配置:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"mysql": "Server=localhost;port=3306;Database=gps;Uid=root;Pwd=123456;persistsecurityinfo=True;Character Set=utf8;"
},
"AllowedHosts": "*"
}
然后在我们的ServerInit类里面引用Res类,初始化我们的MyDbContext库,代码如下:
/// <summary>
/// 启动数据库
/// </summary>
private void DbInit()
{
try
{
Res.MyDb.Database.EnsureCreated();
}
catch (Exception e)
{
LogHelper.WriteLog(e.Message);
}
}
DbInit()的引用放在我们“LogHelper.Start();”后面
然后在Program.cs文件中将我们的数据库链接配置读取出来,传递给ServerInit,用于初始化我们的数据库,具体实现,请查看工程源码。
此时启动我们的程序,我们可以看到,在MySql中会自动生成我们的表,如下:

然后我们就可以像《如何使用C#读写Mysql数据库》章节里面讲的一样,操作我们的数据库了。
3、注意事项
.net6.0中string默认是不支持null判断的,需要和其他类型一样,添加个问号。在旧版本中,使用EF建的数据库表,string类型默认是支持空值的。如下:

当采用.net6.0之后,string类型默认不支持空类型。

由此引发的问题就是:当你想对项目框架进行升级,将低版本的.net升级到6.0时,你会发现,如果你不对sting设置允许为空,数据库报表读取会报错,这是个很坑爹的问题。。。。