C# FreeSql使用,基于Sqlite的DB Frist和Code First测试

文章目录

  • 前言
  • 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懒人开发,把底层的逻辑交给程序,自己把重点关心在业务逻辑上面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Vue组合式API的实用工具集

简介 今天,给大家分享一个很实用的工具库 VueUse,它是基于 Vue Composition Api,也就是组合式API。支持在Vue2和Vue3项目中进行使用,据说是目前世界上Star最高的同类型库之一。 图片 官方地址:https://vueuse.org/ 中文地址:https://www.vueusejs.com/ github:https…

邂逅Node.JS的那一夜

邂逅Node.JS的那一夜&#x1f303; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 本篇文章&#xff0c;并不完全适合小白&#xff0c;需要有一定的HTML、CSS、JS、HTTP、Web等知识及基础学习&#xff1a; &#x1f197;&#xff0c;紧接上文&#xff0c;…

SQL-分页查询and语句执行顺序

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

SQL-条件查询与聚合函数的使用

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

uniapp中uview组件库丰富的ActionSheet 操作菜单使用方法

目录 #平台差异说明 #基本使用 #配置顶部的提示信息和底部取消按钮 #如何知道点了第几项 #API #Props #Event 本组件用于从底部弹出一个操作菜单&#xff0c;供用户选择并返回结果。 本组件功能类似于uni的uni.showActionSheetAPI&#xff0c;配置更加灵活&#xff0c;所…

Realm Management Extension领域管理扩展之颗粒保护检查

本节描述了RME引入的颗粒保护检查。颗粒保护检查使得能够在不同的物理地址空间之间动态分配内存区域。 本节将向您介绍以下功能: 颗粒保护表的结构用于颗粒保护检查的故障报告区域在物理地址空间之间的过渡正如在物理地址一节中所述,RME提供了四个物理地址空间。以下图表显示…

GEE数据集——2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR

2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR 该地理空间数据集包含关键的生物物理参数&#xff0c;即叶面积指数&#xff08;LAI&#xff09;和光合有效辐射分量&#xff08;FPAR&#xff09;&#xff0c;是描述陆地生态系统特征不可或缺的参数。该数据集解…

简约的网易云音乐播放器SPlayer

今天给大家介绍另一款音乐播放器 SPlayer &#xff0c;如果你对第三方网易云音乐播放器感兴趣&#xff0c;可以去看看老苏之前写的其他项目 文章传送门&#xff1a; 高颜值的第三方网易云播放器YesPlayMusic&#xff08;续&#xff09;跨平台的第三方网易云播放器Radishes 什么…

Numpy使用简介

Numpy 相关题目 【Python】—— Numpy 初体验 【Python】—— NumPy基础及取值操作 Numpy是基于Python的通用数值计算工具包&#xff0c;其内包含大量数学计算函数和矩阵运算函数。多数科学计算工具包&#xff0c;比如Scipy&#xff0c;和数值分析工具包&#xff0c;比如Pandas…

【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》专…

Java面试题之虚拟机

前言 本篇的面试题基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 什么是虚拟机&#xff1f; Java 虚拟机&#xff0c;是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class )。 Java 被设计成允许应用程序可…