学习任何新的知识都付出时间成本和心力的,特别这个知识还要求你能够的在各种不同的工程项目中灵活使用,切如果相要在工程项目中使用,就必须把该新识所涉及到的知识点都要进行深入的学习,才能满足上要求。
实际上作为数据库数据交互中间件,我会熟练使用的就有两种Entity Framework Core和FluentMigrator那为什么还要花大力气,再学习一种新的数据库数据交互中间件呢?,它能为我们的程序开发带来什么好处,所花的时间成本是否与所得了收获是否相匹配,这些都是问题。但是SqlSugarCore数据库数据交互中间件打动我下决心要学好它的一个重要因素是:该中间件中内置定义了逻辑分页方法,开发者不必在工程项目中自定义逻辑分页方法把从数据库表中获取的数据分页后存储到内存中了,这些操作都有SqlSugarCore数据库数据交互中间件的内置的逻辑分页方法完成了。
网上把这些数据库数据交互中间件统称为:“ORM框架”,但站在程序项目的角度,称它们为“数据库数据交互中间件”更加合适,因为本质上它实现的功能是:实现指定数据库表与程序项目实体之间的数据交互操作,包含且不限于CURD操作。
1 在SQL数据库软件中自动生成相应的数据库及表
SqlSugarCore中间件通过内置类SqlSugarClient或者SqlSugarScope的实例,连接到指定数据库软件中的指定数据,及其实现实体与数据库表进行CURD操作,SqlSugarClient或者SqlSugarScope实例化操作的定义实现的代码是一样的,但是它们之间也有区别,如下图所示:
上面图片中的信息来源于:“简单示例,1分钟入门 - SqlSugar 5x - .NET果糖网 (donet5.com)”,本人建议最好通过SqlSugarScope类的实例来构建相应的CURD操作,毕竟SqlSugarScope类是由SqlSugarCore中间件最新定义的,中间件开发者,定义一个与SqlSugarClient类功能一样的类,除了上图的因素外一定有其它的考虑,作为一个使用者如果程序从工程的角度考虑,引入第3方包要遵循这几条基本准则:
1、第3方包的最后版本必须是在近3年内的,如果是近1年内的最好,因为按照开发环境visual studio和框架.Net(Core)的版本迭代速度,如果一个第3方包在有3年内没有推出新版本,哪怕它再好用,也有跟不上时代的巨大嫌疑,同时与当前框架的兼容性的配置也会造成程序快速、健壮开发的现实问题。
2、必须有3个以上的迭代版本,框架不在列。
3、如果新版的第3方包或框架中有新的类或方法,与旧版的类或方法具体相同的功能,那么使用者如果知道它们的不同最好(毕竟给自己1个能够说服自己的强大的理由);不知道那更好,只要无脑的使用最新的就好,因为那就不属于你的范畴,即使你所知的理由也不是全部。
1.1 概念“上下文”
1、同步: 在同一个线程是同一个上下文。
说明:只要方法的相互调用过程中一直接调用的是同步方法,则这些方法之间一定属于同一个线程,那么,这些方法中如果调用的上下文实例,那么该实例就是同1个实例。
2、在同一串await 中是一个上下文 (await 会改变线程和同步是不一样的)
说明:只要方法的相互调用过程中出异步方法,由于这些方法之间不一定属于同一具线程,如果调用的上下文实例,哪么极大概率上,上下文可能由不同的线程实例化为不同的实例,注意:是极大概率,不是绝对。
上述信息来源于:“简单示例,1分钟入门 - SqlSugar 5x - .NET果糖网 (donet5.com)”。
上面这些情况只限于.Net(Core)框架,同时造成上述情的因此除了这些外也有依赖注入的原因在内,例如在nopCommerce程序的EngineContext.cs中定义了下面的方法:
[MethodImpl(MethodImplOptions.Synchronized)]
public static IEngine Create()
{
//create NopEngine as engine
return Singleton<IEngine>.Instance ?? (Singleton<IEngine>.Instance = new NopEngine());
}
该方法通过“[MethodImpl(MethodImplOptions.Synchronized)]”标记,来限定通过IEngine实例注入到容器中的类在实例化时,不但保证这些实现处于同1线程中,同时如果这些实例的方法异步调用了上下文实例,也保证了所有被调用的上下文实例是同1个实例。
2 最简注入
2.1 Specialty实体
using SqlSugar;
namespace Data.Domain.Students
{
/// <summary>
/// 【专业--类】
/// <remarks>
/// 摘要:
/// 通过该实体类及其属性成员,用于实现当前程序【Data】.【领域】.【学生集】.【专业】实体与“[SqlSugarAcquaintance].[Specialty]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public class Specialty
{
/// <summary>
/// 【编号】
/// </summary>
/// <remarks>
/// 摘要:
/// 获取/设置专业实体1个指定实例的整型编号值。
/// [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]标记:
/// 该标记将该属性成员所映射[Specialty].[Id]字段约束定义为:主键。
/// </remarks>
[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
public int Id { get; set; }
/// <summary>
/// 【名称】
/// </summary>
/// <remarks>
/// 摘要:
/// 获取/设置1个指定专业的名称。
/// [SugarColumn(ColumnDataType = "Nvarchar(255)")]标记:
/// 该标记将该属性成员所映射[Specialty].[Name]字段的长度约束定义为:“nvarchar(255)”,字段长度约束的默认类型为:“varchar,
/// 同时标记的约束定义权限高于上下文约束定义的权限,即指定表中指定字段长度的约束类型和长度,最终将由该标记约束定义所决定。
/// </remarks>
[SugarColumn(ColumnDataType = "Nvarchar(255)")]
public string Name { get; set; }
}
}
2.2 SqlSugarContext上下文
using Data.Domain.Students;
using SqlSugar;
namespace Data
{
/// <summary>
/// 【SqlSugar上下文】
/// </summary>
/// <remarks>
/// 摘要:
/// 获取/设置通过该类实例化“SqlSugarCore”中间件的实例,并通过该间件的实例实现在指定数据库软件中自动生成相应的数据库及其表,
/// 同时为当前项目的实体与数据库中相应表的CURD操作提供支持实例(SqlSugarScope实例)。
/// </remarks>
public class SqlSugarContext
{
#region 拷贝构造方法与依赖注入变量实例化
/// <summary>
/// 【上下文中间件实例】
/// </summary>
/// <remarks>
/// 摘要:
/// 声明上下文中间件实例,该实例用于为类中的属性成员赋值,并为当前类中定义的CURD操作提供支撑。
/// </remarks>
private readonly SqlSugarScope _sqlSugarScope;
/// <summary>
/// 【拷贝构造方法】
/// </summary>
/// <remarks>
/// 摘要:
/// 通过该拷贝构造方法连接到指定数据库(SQL Server)数据库软件中数据库,获取SqlSugarScope实例,实现在数据库软件(SQL Server)中自动生成相应的数据库及其表,
/// 同时为当前项目的实体与数据库中相应表的CURD操作提供支持实例(SqlSugarScope实例)。
/// 说明:
/// 该拷贝构造方法把【SqlSugar上下文】类的实例,以最简方式注入到内置容器中。
/// </remarks>
public SqlSugarContext()
{
_sqlSugarScope = new SqlSugarScope(new ConnectionConfig()
{
//数据库连接字符串,该字符串特定针对:SqlServer数据库软件。
ConnectionString = @"Data Source=.;Initial Catalog=SqlSugarAcquaintance;Integrated Security=False;Persist Security Info=False;User ID=zz;Password=zz;MultipleActiveResultSets=true;Trust Server Certificate=True",
//实现数据交互操作的数据库软件(SqlSugarCore中间件的默认缺省枚举实例为:“MySql”,即MySql数据库软件;当前被设定为:SqlServer数据库软件)。
DbType = DbType.SqlServer,
//默认false, 时候知道关闭数据库连接, 设置为true,即自动释放数据库,如果存在事务,在事务结束后释放,而无需使用using块或者Close内置方法定义释放操作。
IsAutoCloseConnection = true,
//默认SystemTable, 字段信息读取, 如:该属性是不是主键,标识列等等信息,即从实体特性中读取主键自增列信息。
InitKeyType = InitKeyType.Attribute
});
//在指定数据库(SQL Server)数据库软件中自动生成相应的数据库及其表。
CreateTable(false, 50, typeof(Specialty));
}
#endregion
#region 属性
/// <summary>
/// 【上下文中间件实例】
/// </summary>
/// <remarks>
/// 摘要:
/// 设置上下文中间件实例,该实例用于为当前项目的实体与数据库中相应表的CURD操作提供支持实例(SqlSugarScope实例)。
/// </remarks>
public SqlSugarScope SugarScope => _sqlSugarScope;
#endregion
#region 方法--私有/保护
///<param name="backup">指示在指定的数据库软件中自动生成指定的数据库及其表后,指定数据库软件是否支持对该数据库执行自动备份操作,默认值:false,即不执行自动备份操作。</param>
///<param name="stringDefaultLength">
/// 数据库中所有字符串类型字段的长度约束值,默认值:50,设置所有字串类型的字段的默认长度为:“varchar(50)”,
/// SqlSugarCore字符串类型默认约束映射类型为“varchar”而不是“nvarchar”。
/// </param>
///<param name="types">数组实例,存储着当前项目中的实体类的类型实例,为在指定的数据库中自动生成相应的表提供数据支撑。</param>
/// <summary>
/// 【生成数据库】
/// </summary>
/// <remarks>
/// 摘要:
/// 该方法把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。
/// </remarks>
protected void CreateTable(bool backup = false, int stringDefaultLength = 50, params Type[] types)
{
//如果指定的数据库软件中不存在指定的数据库,则自动生成该数据库。
_sqlSugarScope.DbMaintenance.CreateDatabase();
if (backup)
{
//如果数据库软件对自动生成的数据库支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。
//注意:SetStringDefaultLength(stringDefaultLength)必须定义在下行语句中,否则在自动生成表时,该约束定义将不会被映射到表的字段上。
_sqlSugarScope.CodeFirst.SetStringDefaultLength(stringDefaultLength).BackupTable().InitTables(types);
}
else
{
//如果数据库软件对自动生成的数据库不支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。
//注意:SetStringDefaultLength(stringDefaultLength)必须定义在下行语句中,否则在自动生成表时,该约束定义将不会被映射到表的字段上。
_sqlSugarScope.CodeFirst.SetStringDefaultLength(stringDefaultLength).InitTables(types);
}
}
#endregion
}
}
2.3 HomeController控件器
public IActionResult Index()
{
_context.SugarScope.Queryable<Specialty>();
return View();
}
2.4 Program.cs最简注入
//最简注入
builder.Services.AddSingleton<SqlSugarContext>();
对以上功能更为具体实现和注释见:22-09-28-02_SqlSugarAcquaintance(初识SqlSugarCore之最简注入)。