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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python进行简单的app自动化测试(pywinauto)+ 截屏微信二维码

一、开始需要了解准备 1、安装 pip install pywinauto2、选择&#xff08;后面会通过工具进行判断用哪个&#xff09; 3、自动化控制进程的范围 示例 Application单进程 Desktop多进程 4、程序辅助检测工具 3中的下载连接 链接 点击放大镜拖到对应位置即可 二、简单的开始…

前端页面优化做的工作

1.分析模块占用空间 new (require(webpack-bundle-analyzer).BundleAnalyzerPlugin)() 2.使用谷歌浏览器中的layers&#xff0c;看下有没有影响性能的模块&#xff0c;或者应该销毁没销毁的 3.由于我们页面中含有很大的序列帧动画&#xff0c;所以会导致页面性能低&#xff0…

合并 K 个升序链表[困难]

一、题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如…

Maven 依赖管理项目构建工具 教程

Maven依赖管理项目构建工具 此文档为 尚硅谷 B站maven视频学习文档&#xff0c;由官方文档搬运而来&#xff0c;仅用来当作学习笔记用途&#xff0c;侵删。 另&#xff1a;原maven教程短而精&#xff0c;值得推荐&#xff0c;下附教程链接。 atguigu 23年Maven教程 目录 文章目…

2024-01-11 部署Stable Diffusion遇挫记

点击 <C 语言编程核心突破> 快速C语言入门 部署Stable Diffusion遇挫记 前言一、一如既往的GitHub部署二、使用的感受总结 create by Stable Diffusion; prompt: fire water llama 前言 要解决问题: 由于近期的努力, 已经实现语音转文字模型, 通用chat迷你大模型的本地…

适配 IOS 安全区域

安全区域指的是一个可视窗口范围&#xff0c;处于安全区域的内容不受圆角&#xff08;corners&#xff09;、齐刘海&#xff08;sensor housing&#xff09;、小黑条&#xff08;Home Indicator&#xff09;影响。 造成这个问题的主要原因就是 iphoneX 之后在屏幕上出现了所谓…

Swoft - Bean

一、Bean 在 Swoft 中&#xff0c;一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。 最直观的感受就是省去了频繁new的过程&#xff0c;节省了资源的开销。 二、Bean的使用 1、创建Bean 在【gateway/app/Http/Controller】下新建一个名为…

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导 文章目录 鸿蒙HarmonyOS兼容JS的类Web开发-开发指导常用组件开发指导list开发指导创建list组件添加滚动条添加侧边索引栏实现列表折叠和展开场景示例 dialog开发指导创建dialog组件设置弹窗响应场景示例 form开发指导创建form组件实现…

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

css3边框与圆角

css3边框与圆角 前言边框的三要素边框的三要素小属性 四个方向的边框四个方向边框的三要素小属性 去掉边框利用边框制作三角形圆角 border-radius单独设置四个圆角小属性百分比为单位 盒子阴影阴影延展内阴影多阴影 结语 前言 在网页设计中&#xff0c;边框与圆角不仅仅是简单…

FAST OS DOCKER 可视化Docker管理工具

介绍 FAST OS DOCKER 界面直观、简洁&#xff0c;非常适合新手使用&#xff0c;方便大家轻松上手 docker部署运行各类有趣的容器应用&#xff0c;同时 FAST OS DOCKER 为防止服务器负载过高&#xff0c;进行了底层性能优化&#xff1b;其以服务器安全为基础&#xff0c;对其进…

天津大数据分析培训班 常见的大数据培训课程

大数据现在属于热门职业技能之一&#xff0c;不管是大学毕业生&#xff0c;计算机和数据相关专业青年&#xff0c;已经工作一阵的开发人员&#xff0c;运营小白&#xff0c;还是其他想进入这个行当的&#xff0c;可能还没有编程基础的转行人&#xff0c;都想尝试大数据行业&…

联手英特尔,释放星飞分布式全闪存储潜能

近日&#xff0c;英特尔官网发布了与 XSKY 星辰天合联手打造的解决方案&#xff0c;即 XSKY 的新一代全闪分布式存储系统 XINFINI&#xff0c;该存储系统采用英特尔 QAT 加速数据压缩/解压缩&#xff0c;从而大幅度提升存储系统性能。 全闪存储系统面临的解压缩挑战 在存储系统…

【开源】基于JAVA+Vue+SpringBoot的大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

Java21 如何使用switch case

1. Java8 和 Java21 Java8 引入字符串和枚举 Java21 可以返回值, yield关键字, switch 表达式, 模式匹配, null值处理 2. 代码案例 1. Java8 public static void java8() {String day "tuesday";switch (day) {case "monday":System.out.println("w…

3.4 在开发中使用设计模式

现在&#xff0c;我们应该对设计模式的本质以及它们的组织方式有了初步的认识&#xff0c;并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨&#xff0c;我们打下了坚实的基础。初步了解了UML的基本构建模块后&#xff0c;我们现在可以…

Qt优秀开源项目之二十一:遇见QSkinny,一个轻量级Qt UI库

目录 一.QSkinny简介 二.工作原理 三.编译 一.QSkinny简介 QSkinny库基于Qt Graphic View和Qt/Quick中少量的核心类。它提供了一组轻量级控件&#xff0c;可以在C或QML中使用这些控件。QSkinny默认是启用硬件加速的&#xff0c;非常适合嵌入式设备&#xff0c;目前已经应用于…

修改SSH默认端口,使SSH连接更安全

以CentOS7.9为例&#xff1a; 1、修改配置文件 vi /etc/ssh/sshd_config 2、远程电脑可连接&#xff0c;暂时将SELinux关闭 # 查询状态 getenforce # 关闭 setenforce 0 # 开启 setenforce 1 3、SELinux设置&#xff08;如果启用&#xff09;&#xff0c;semanage管理工具安…

XCTF-Misc1 pcap1 misc2-1

pcap1 附件是一个xxxxx.pcap流量包 分析 1. 流量包筛选 统计协议分级&#xff0c;发现主要是TCP协议 查看TCP协议的流量包&#xff0c;筛选关键词tcp contains flag 跟踪TCP流&#xff0c;发现是python代码&#xff0c;将其导出 2. 导出的代码分析 导出的代码&#xff…

计算机图形学作业:Cohen-Sutherland和Liang-Barsky 裁剪算法

参考书籍和资料&#xff1a; Liang-Barsky参考下面视频14.2.1 [14.2.1]--讲解经典的梁友栋-巴斯基算法。_哔哩哔哩_bilibili Cohen-Sutherland参考孔令德的计算机图形学实验及课程设计&#xff08;第二版&#xff09;&#xff0c;实验五直线段的裁剪 题目如下&#xff1a; …