对于一个工程性程序而言,是否支持对多数据库的CURD操作,不是必须的,只是为了预防程序部署和运行过程中如果因为版权问题而产生的额外成本而预留的退路。对于移动设备的前后端分离程序而言,如果数据库需要部署到移动设备中,那么最好的数据库选择就是:SQLite(移动端数据库),所以这种应用场景工程性程序就必须对多数据库进行支持。
对于多数据库支持而言SqlSugar中间件是最为强大和方便的,其次是FluentMigrator中间件,二者本身都能完全实现对多数据库的支持。Microsoft.EntityFrameworkCore中间件本身并不能完全支持多数据库,对于MySql数据库的支持而言,就需要Microsoft.EntityFrameworkCore中间件与MySql.Data.EntityFrameworkCore中间件或Pomelo.EntityFrameworkCore中间件相互配合才能实现对MySql数据库的CURD操作。对于.Net程序来说不管MySql.Data.EntityFrameworkCore中间件或Pomelo.EntityFrameworkCore中间件,都是第3方中间件;对于MySql数据库来说MySql.Data.EntityFrameworkCore中间件是内置中间件(二都由Oracle开发),而Pomelo.EntityFrameworkCore中间件则是第3方中间件,但是在具体使用时却恰恰相反,由于MySql.Data.EntityFrameworkCore中间件Bug比较多,所以不推荐使用,反则Pomelo.EntityFrameworkCore中间件由于Bug少从而在程序中被广泛使用。
说实话在这3个CURD中间件中如果SqlSugar中间件能够去除实体中的特性耦合,SqlSugar中间件功能强大使用简单,符合国内使用的特点,是最好的选择。
1 在Data项目中引用Pomelo.EntityFrameworkCore.MySql
2 在“appsettings.json”文件中设置多数据库初始化所需要数据
"ConnectionStrings": {
//Trusted_Connection=true或Integrated Security=true/SSPI:“Windows凭据”对SQL Server进行身份验证,表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库。
//"integrated":"security=true是通过“Windows身份认证”对SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库,如果integrated", "security=false","或者不写,表示一定要输入正确的数据库登录名和密码。": null。
//Persist Security Info:该配置只用于通过“SQL Server身份认证”对SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;简单的理解为"ADO在数据库连接成功后是否保存密码信息",True表示保存,False表示不保存.ADO缺省为True(ADO.net缺省为False,未测试,根据参考资料上说的)。
//MultipleActiveResultSets:它允许在单个连接上执行多重的数据库查询或存储过程,目前只适用于Sql Server 2005及其以上版本;如果不用MultipleActiveResultSets ,则一般报错为sqldatareader未关闭,即需要关闭了之后才能打开另一个。
//Trust Server Certificate:是否使用SSL证书和加密方式,对SQL Server数据库的连接字符串进行加密,该操作属性安全性配置,目前只适用于Sql Server 2005及其以上版本;
//"SqlServerWindows": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=true;MultipleActiveResultSets=true;Trust Server Certificate=True"
//IIS发布部署连接字符串必须使用“SQL Server身份认证”数据库连接方式,才能实现发布部署程序与数据库的CURD的操作
//"SqlServerSQL": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=False;Persist Security Info=False;User ID=zz;Password=zz;MultipleActiveResultSets=true;Trust Server Certificate=True",
//Character Set=utf8_general_ci;mysql数据库的字符串查询操作禁用大小写敏感配置。
//Character Set=utf8_bin;mysql数据库的字符串查询操作启用大小写敏感配置,注意:但配置配置在连接字符串中无效。
"MySQL": "Server=localhost;port=3306;Database=ShopDemo;Uid=root;Pwd=zhoujian;Character Set=utf8_general_ci;"
},
3 在Program.cs定义多数据库依赖注入中间件
//把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
builder.Services.AddDbContext<EFCoreContext>(
//通过“DbContextOptionsBuilder”实例中的参数实例,为“Microsoft.EntityFrameworkCore.SqlServer”中间件的实例化提供参数实例,
//最终把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
//IIS发布部署连接字符串必须使用“SQL Server身份认证”数据库连接方式,才能实现发布部署程序与数据库的CURD的操作。
//options => options.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerSQL"))
//实现“Microsoft.EntityFrameworkCore”中间件实例与“MySql”数据库的连接。
options => options.UseMySql(builder.Configuration.GetConnectionString("MySQL"), MySqlServerVersion.LatestSupportedServerVersion)
);
4 WebApi.Controllers.MulDatabaseTestController
using Core.Domain.Users;
using Data;
using Data.Extensions;
using Microsoft.AspNetCore.Mvc;
namespace WebApi.Controllers
{
[Route("[controller]/[action]")]
[ApiController]
public class MulDatabaseTestController : ControllerBase
{
#region 拷贝构造方法与变量
private readonly EFCoreContext _context;
public MulDatabaseTestController(EFCoreContext context)
{
_context = context;
}
#endregion
#region 方法
/// <summary>
/// 【获取角色列表--需权限】
/// </summary>
/// <remarks>
/// 摘要:
/// 从角色表中获取角色实体的所有实例,并把这些实例存储到列表实例中。
/// </remarks>
/// <returns>
/// 返回:
/// 列表实例,该实例存储着角色实体的所有实例。
/// </returns>
[HttpGet]
public async Task<List<Role>> GetRoleListAsync()
{
//通过“Microsoft.EntityFrameworkCore”实例以Code-First方式删除和创建数据库。
//_context.Database.EnsureDeleted();
//_context.Database.EnsureCreated();
return await _context.GetDbSet<Role>().ToListAsync();
}
#endregion
}
}
对以上功能更为具体实现和注释见:230112_008shopDemo(多数据库支持之MySql)