文章目录
- 前言
- FreeSql 简单连接
- 数据库服务不存在
- 没装FreeSql.All
- 装了FreeSql.All
- 安装包选择
- DBFirst
- 安装命令行生成器
- 生成Bat创建脚本
- 基于Sqlite的Code Frist
- 文件夹自动导出到Debug目录
- Sqlite 数据库安装和创建
- Sqlite连接
- 数据库自动增列增表测试
- 增列
- 删列
- 改列名
- 同名列改属性
- CodeFrist的意义
- 总结
前言
Freesql是一个C# 的ORM框架,C# 另一个框架是Sqlsugar。两个从Nuget下载量和Github的星星上面,其实都差不多。两个作者之间有点矛盾,但是我是一个局外人,啥都不懂,技术哪个好用用哪个,我平时做的也就是CRUD这种工作。
FreeSql相关链接
Freesql官方文档
SqlSugar我之前也用过
.NET SqlSuger 简单介绍,超快开发数据库
FreeSql 简单连接
Nuget安装一下
//新建实例对象
var MyFreeSql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, "你的数据库连接串")
.Build();
//测试网络连接
MyFreeSql.Ado.ExecuteConnectTest();
数据库服务不存在
原因是缺乏对应的数据库连接包
Freesql 指南安装
对导出文件大小无所谓就直接用FreeSql.All即可
没装FreeSql.All
装了FreeSql.All
安装包选择
35MB其实还能接受,比较我们是快速开发,代码能跑就行。
DBFirst
FreeSql DbFirst
DBFirst导出有两种方式:
- 直接在Debug文件导出,然后自己复制粘贴
- 使用命令行直接生成
Sqlsugar是直接在Debug文件导出的,FreeSql是使用命令行去生成的。
安装命令行生成器
尝试全局安装,安装的时候会卡个一分钟,然后跳出成功界面
dotnet tool install -g FreeSql.Generator
输入指令,查看是否安装成功
FreeSql.Generator --help
生成Bat创建脚本
根据官方建议,在实体类根目录下面生成对应的bat文件
填写对应的参数
创建如下的Bat执行脚本文件
FreeSql.Generator -Razor 1 -NameOptions 0,0,0,1 -NameSpace LinCms.Core.Entities -DB "MySql,Data Source=127.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=lincms;Charset=utf8;SslMode=none;Max pool size=2"
运行成功
会生成一个重新生成的bat文件
基于Sqlite的Code Frist
文件夹自动导出到Debug目录
为了方便资源文件夹的保存,我这里定义一个全局的资源文件夹
Visual Studio C# 项目生成时复制项目资源目录到生成目录
<ItemGroup>
<!-- 这里可以改成任意的文件的,我这里设置我自己的资源文件夹全部文件包括根目录输出到Debug路径 -->
<None Include="Resources\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
生成成功
Sqlite 数据库安装和创建
FreeSql不会主动创建数据库,需要我们自己先手动创建
SQLite 在Windows环境下使用命令行shell创建SQLite数据库
命令行输入指令,确认Sqlite安装成功
sqlite3
生成Sqlite数据库文件
sqlite3
.open mydatabase.db
当然如果你有别的软件,比如Navicat Premium,也可以使用软件直接创建
Sqlite连接
FreeSql的Sqlite的连接串大概长这样
- DataType.Sqlite
- Data Source=|DataDirectory|\document.db; Attachs=xxxtb.db; Pooling=true;Min Pool Size=1
FreeSql CodeFirst 官方文档
测试一下数据库连接状态
internal class Program
{
static void Main(string[] args)
{
//新建实例对象
var MyFreeSql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=Resources\mydatabase.db; Attachs=test.db; Pooling=true;Min Pool Size=1")
.Build();
//测试网络连接
var isConnect = MyFreeSql.Ado.ExecuteConnectTest();
Console.WriteLine($"数据库连接状态{isConnect}");
Console.WriteLine("Hello, World!");
Console.ReadKey();
}
}
数据库自动增列增表测试
默认有个main数据库
测试代码
static void Main(string[] args)
{
//新建实例对象
var MyFreeSql = new FreeSql.FreeSqlBuilder()
//连接test数据库
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=Resources\mydatabase.db; Attachs=test.db; Pooling=true;Min Pool Size=1")
.UseAutoSyncStructure(true) //自动同步实体结构【开发环境必备】,FreeSql不会扫描程序集,只有CRUD时才会生成表。
.UseMonitorCommand(cmd => Console.Write(cmd.CommandText))
.Build();
//MyFreeSql
//测试网络连接
var isConnect = MyFreeSql.Ado.ExecuteConnectTest();
Console.WriteLine($"数据库连接状态{isConnect}");
var students = MyFreeSql.Queryable<Student>().Take(100).OrderByDescending(t => t.Id).ToList();
var teachers = MyFreeSql.Queryable<Teacher>().Take(100).OrderByDescending(t => t.Id).ToList();
Console.WriteLine("Hello, World!");
Console.ReadKey();
}
测试实体类
/// <summary>
/// 学生类
/// </summary>
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
public int StudentNo { get; set; }
}
/// <summary>
/// 教师类
/// </summary>
public class Teacher
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int TeacherNo { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
}
打印语句
自动生成表结构
为什么库名还是main?
根据我的理解,Sqlite3是一个数据库文件当做一个数据库的。所以库名不会改变
Sqlite数据库容量的上限是128TB,一般来说够用了。我公司用的SqlServer数据库,运行了5年也就900GB,1GB不到的数据+一堆事物(增删改查的记录)
增列
/// <summary>
/// 学生类
/// </summary>
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
public int StudentNo { get; set; }
/// <summary>
/// 增列测试
/// </summary>
public int StudentId { get; set;}
}
删列
/// <summary>
/// 学生类
/// </summary>
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
//删掉该列
//public int StudentNo { get; set; }
/// <summary>
/// 增列测试
/// </summary>
public int StudentId { get; set;}
}
改列名
/// <summary>
/// 学生类
/// </summary>
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
/// <summary>
/// 改列名从StudentNo改成StudentNoNew
/// </summary>
public int StudentNoNew { get; set; }
/// <summary>
/// 增列测试
/// </summary>
public int StudentId { get; set;}
}
经过多次测试,确实会同步改列名,这个我不知道是怎么做到的,估计是根据反射属性的顺序进行判断
同名列改属性
public class Student
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
/// <summary>
/// 改列属性
/// </summary>
public string StudentNoNew { get; set; }
/// <summary>
/// 增列测试
/// </summary>
public int LALAL { get; set; }
}
CodeFrist的意义
使用了CodeFrist,第一就是敏捷开发,程序员不需要知道数据库新增表,新增列是如何操作的,只需要关注业务代码。而且就可以使用基础和泛型了
/// <summary>
/// 声明抽象基类
/// </summary>
public abstract class SqliteBase
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public DateTime CreateTime { get; set; }
}
/// <summary>
/// 学生类
/// </summary>
public class Student:SqliteBase
{
public string Name { get; set; }
/// <summary>
/// 改列属性
/// </summary>
public string StudentNoNew { get; set; }
/// <summary>
/// 增列测试
/// </summary>
public int LALAL { get; set; }
}
/// <summary>
/// 教师类
/// </summary>
public class Teacher:SqliteBase
{
public int TeacherNo { get; set; }
public DateTime CreateTime { get; set; }
public string Name { get; set; }
}
而且可以使用泛型方法,泛型约束,扩展方法。这里就不展开说明了。简单来说就是可以更加规范的使用。至少在使用Sqlite数据库的时候可就可以使用Code Frist敏捷开发,毕竟就是用来做本地缓存数据库的,数据表变来变去无所谓,能存数据就行。
总结
FreeSql 用起来还是很不错的,毕竟主打的就是ORM懒人开发,把底层的逻辑交给程序,自己把重点关心在业务逻辑上面。